You are on page 1of 9

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

BÀI TẬP THỰC HÀNH 04: SẮP XẾP

Họ tên: Hoàng Hào Quang


MSSV: 1712701

Khoa Công nghệ thông tin


Đại học Khoa học tự nhiên TP HCM
1. Các thuật toán:

1.1. Selection Sort


 Ý tưởng: chọn phần tử nhỏ nhất cho vào vị trí đầu tiên
sau đó chọn phần tử nhỏ thứ 2 cho vào vị trí thứ 2, cứ
tiếp tục như vậy cho tới khi kết thúc mảng.
 Đánh giá độ phức tạp : O(n2)

1.2. Insertion Sort


 Ý tưởng: chèn phân tử thứ i vào đúng vị trí trong dãy từ
0 tới i -1 đã sắp
 Đánh giá độ phức tạp : O(n2)

1.3. Binary Insertion Sort


 Ý Tưởng: tương tự như insertion sort nhưng sử dụng
binary search để tìm vị trí cần chèn vào.
 Đánh giá độ phức tạp: Vẫn là O(n2) vì trong trường hợp
xấu nhất vẫn phải dịch mảng n lần.

1.4. Bubble Sort


 Ý Tưởng : đưa phần tử lớn nhất về sau cùng bằng cách
so sánh các cặp kề nhau và đổi chỗ, phần tử lớn nhất sẽ
chạy về sau cùng, tiếp tục với phần tử lớn thứ 2, thực
hiện tiếp cho đến khi kết thúc mảng.
 Đánh giá độ phức tạp: O(n2) cho mọi trường hợp

ĐH Khoa học tự nhiên TP HCM 2


1.5. Shaker Sort
 Ý Tưởng : tương tự như bubble sort những mỗi lần duyệt
qua 1 lượt sẽ đảu chiều đồng thời lưu 2 vị trí cuối cùng bị
swap ở đầu và cuối để giảm số lần duyệt tiếp theo
 Đánh giá độ phức tạp: vẫn là O(n2)

1.6. Shell Sort


 Ý Tưởng : phân chia dãy ban đầu thành nhiều dãy con
mỗi phần tử cách nhau h vị trí, dùng insertion sort để sắp
xếp các mảng con này. Tiếp tục giảm h và thực hiện lại
cho đến khi h = 1.
 Đánh giá độ phức tạp: Độ phức tạp của thuật toàn này
phụ thuộc nhiều vào cách chọn h và số lần chọn h. Nhưng
cơ bản giải thuật này có độ phức tạp bé hơn rất nhiều so
với O(n2)

1.7. Heap Sort


 Ý Tưởng : tư tưởng chính giống như selection sort, tìm
phần tử lớn nhất cho vào cuối, tuy nhiên việc tìm phần tử
này được thực hiện bằng cách sử dụng cấu trúc dữ liệu
Heap.
 Đánh giá độ phức tạp: O(n*Log(n))

1.8. Merge Sort


 Ý Tưởng : Chia để trị, chia dãy thành 2 dãy con, đệ quy
việc chia dãy cho 2 dãy con rồi nối ghép 2 dãy con này
lại, thực chất việc sắp xếp dãy chính là quá trình nối ghép
dãy con của nó.
 Đánh giá độ phức tạp: O(nLog(n))

ĐH Khoa học tự nhiên TP HCM 3


1.9. Quick Sort
 Ý Tưởng : Chia để trị, chọn 1 phần tử làm chốt, phân vùng
dãy xung quanh điểm chốt này, thực hiện đệ quy tiếp cho
2 dãy con sau khi phân vùng.
 Đánh giá độ phức tạp: trong trường hợp xấu nhất khi mà
phần tử chốt được chọn luôn lớn nhất hoặc nhỏ nhất độ
phức tạp sẽ là O(n2). Xét trung bình độ phức tạp là
O(nLog(n))

1.10. Counting Sort


 Ý Tưởng : dùng mảng phụ với kích thước là phần tử lớn
nhất trong dãy, ánh xạ mỗi phần tử trong dãy với 1 vị trí
trong mảng phụ, vị trí này chứ số lần xuất hiện của giá trị
phần tử, xây dựng lại dãy từ mảng phụ
 Đánh giá độ phức tạp: O(n)

1.11. Radix Sort


 Ý Tưởng : sắp xếp theo cơ số, vỡi mỗi bậc sắp xếp dãy
sao cho dãy tăng dần theo cơ sỗ đó. Cuối cùng ta sẽ
được một dãy đã được sắp.
 Đánh giá độ phức tạp: O(n)

1.12. Flash Sort


 Ý Tưởng : sử dụng thông tin từ giá trị của mỗi phần tử
trong dãy, phân lớp phần tử đó về đúng lớp của nó bằng
công thức: K(A(i))=1+int((m-1)(A(i)-Amin)/(Amax-Amin))
Trong đó K là lớp của phần tử A(i) , m là số lớp.
 Đánh giá độ phức tạp: O(n)

ĐH Khoa học tự nhiên TP HCM 4


2. Kết quả thí nghiệm và nhân xét:

Random:
Random
40

35

30

25

20

15

10

0
1 2 3 4 5

Selection Sort Insertion Sort Binary Insertion Sort Bubble Sort


Shaker Sort Shell Sort Heap Sort Merge Sort
Quick Sort Counting Sort Radix Sort Flash Sort

ĐH Khoa học tự nhiên TP HCM 5


Nhận xét: thuật toán bubble sort tốn nhiều thời gian nhất cho dãy Random vì tốn thêm
chi phí cho việc swap, Shaker sort cải tiến của bubble nên thời gian chạy ít hơn nhưng
vẫn cao hơn các thuật toán còn lại.

Sorted:
Sorted
14

12

10

0
1 2 3 4 5

Selection Sort Insertion Sort Binary Insertion Sort Bubble Sort


Shaker Sort Shell Sort Heap Sort Merge Sort
Quick Sort Counting Sort Radix Sort Flash Sort

Nhận xét: đối với dãy đã sắp xếp, thuật toán selection sort và bubble vẫn phải duyệt qua
2 vòng loop để thực hiện so sánh nên thời gian chạy vẫn khá lâu mạc dù không thực hiện
bất chứ thao tác swap nào. Với quick sort được cài đặt cụ thể trong báo cáo này sử dụng
điểm chốt là phần tử chính giữa nên không rơi vào O(n2)

ĐH Khoa học tự nhiên TP HCM 6


Reverse:
Reverse
35

30

25

20

15

10

0
1 2 3 4 5

Selection Sort Insertion Sort Binary Insertion Sort Bubble Sort


Shaker Sort Shell Sort Heap Sort Merge Sort
Quick Sort Counting Sort Radix Sort Flash Sort

Nhận xét: trường hợp dãy sắp ngược làm cho thuật toán insertion sort và binary insertion
sort rơi vào trường hợp xấu nhất

ĐH Khoa học tự nhiên TP HCM 7


NearlySorted:
NearlySorted
14

12

10

0
1 2 3 4 5

Selection Sort Insertion Sort Binary Insertion Sort Bubble Sort


Shaker Sort Shell Sort Heap Sort Merge Sort
Quick Sort Counting Sort Radix Sort Flash Sort

Nhận xét: trong trường hợp dãy gần như sắp cho ta thấy nhược điểm của selection sort
là luôn thực O(n2) , shaker sort cải tiến hơn bubble sort nên thời gian thực hiện thấp
hơn nhiều so với bubble

ĐH Khoa học tự nhiên TP HCM 8


Cấu trúc dữ liệu và giải thuật Thực hành 4 : Sắp Xếp

3. Tham khảo:

https://www.geeksforgeeks.org/sorting-algorithms/
http://www.neubert.net/Flapaper/9802n.htm
slide bài giảng

ĐH Khoa học tự nhiên TP HCM 9

You might also like