Professional Documents
Culture Documents
Sort Algorithm
Sort Algorithm
BÁO CÁO
(V/v tìm hiểu các thuật toán sắp xếp tăng dần)
2.6.2.4. Bước 4: Kiểm tra nếu đã xét hết dãy mẹ thì dừng thuật toán. Ngược
lại, quay trở lại bước 2.
2.6.3. Đánh giá thuật toán: Ta thấy ở bước 2 và 3, số lần lặp của thuật toán là
log 4 𝑛 và chi phí của 2 bước này tỷ lệ với 𝑛. Như vậy, chi phí thực hiện Merge
Sort là 𝑂(𝑛 log 4 𝑛).
2.7. Thuật toán Quick Sort
2.7.1. Ý tưởng: Chia mảng cần sắp xếp thành 3 phần:
- Phần 1: Mảng con chứa các phần tử nhỏ hơn x
- Phần 2: Phần tử x, là 1 phần tử được chọn ra từ mảng ban đầu
- Phần 3: Mảng con chứa các phần tử lớn hơn x
Lặp lại sự phân chia này với hai phần 1 và 3 cho đến khi các mảng con
chỉ còn 1 phần tử duy nhất thì dừng thuật toán.
2.7.2. Thuật toán:
2.7.2.1. Bước 1: Chọn tuỳ ý một phần tử 𝑎[𝑘] trong dãy làm giá trị mốc.
𝑙≤𝑘≤𝑟
𝑥 = 𝑎 [𝑘 ], 𝑖 = 𝑙, 𝑗 = 𝑟
2.7.2.2. Bước 2: Phát hiện và hiệu chỉnh các cặp phần tử 𝑎[𝑖], 𝑎[𝑗] nằm sai
chỗ:
- Bước 2a: Trong khi (𝑎[𝑖] < 𝑥) 𝑖++
- Bước 2b: Trong khi (𝑎 [𝑗] > 𝑥) 𝑗—
- Bước 2c: Nếu 𝑖 < 𝑗: Hoán vị 𝑎[𝑖 ] và 𝑎[𝑗]
2.7.2.3. Bước 3:
- Nếu 𝑖 < 𝑗: Lặp lại bước 2
- Nếu 𝑖 ≥ 𝑗: Dừng thuật toán
2.7.3. Đánh giá thuật toán
Trường hợp Độ phức tạp
Tốt nhất 𝑛𝑙𝑜𝑔(𝑛)
Trung bình 𝑛𝑙𝑜𝑔(𝑛)
Xấu nhất 𝑛4
2.9.2.2. Bước 2: Tạo các lô chứa các loại phần tử khác nhau. Khởi tạo 10 lô:
𝐵@ , 𝐵6 , 𝐵4 , … , 𝐵P rỗng.
2.9.2.3. Bước 3: Đặt 𝑎5 vào lô 𝐵D với 𝑗 là chữ số thứ 𝑘 của 𝑎5
2.9.2.4. Bước 4: 𝑘 = 𝑘 + 1. Nếu 𝑘 < 𝑚 thì trở lại bước 2. Ngược lại: Dừng
thuật toán.
2.9.3. Đánh giá độ thuật toán: Độ phức tạp của thuật toán là 𝑂(𝑛) và chỉ sắp
xếp được các mảng số nguyên dương.
2.10. Thuật toán Heap Sort
2.10.1.Ý tưởng: Xây dựng cây MinHeap từ các phần tử ban đầu của mảng. Cây
MinHeap thoả mãn một tính chất quan trọng là phần tử root của cây luôn
là phần tử nhỏ nhất. Ta tiến hành lấy phần tử đầu tiên của cây MinHeap ra,
đưa vào mảng kết quả và hiệu chỉnh lại cây sao cho nó vẫn là cây MinHeap.
2.10.2.Thuật toán
2.10.2.1. Giai đoạn 1: Hiệu chỉnh dãy số ban đầu thành Heap
2.10.2.2. Giai đoạn 2:
- Bước 1: Đưa phần tử lớn nhất về vị trí đúng ở cuối dãy: 𝑟 = 𝑛, Hoán vị
𝑎6 và 𝑎Q
- Bước 2: Loại bỏ phần tử lớn nhất ra khỏi Heap: 𝑟 = 𝑟 − 1. Hiệu chỉnh
các phần tử còn lại của dãy từ 𝑎6 , 𝑎4 , … , 𝑎Q thành 1 heap
- Bước 3: Nếu 𝑟 > 𝑙: Lặp lại bước 2. Ngược lại: Dừng.
2.10.3.Đánh giá thuật toán: Việc đánh giá Heap Sort rất phức tạp nhưng người
ta đã chứng minh được trong trường hợp xấu nhất, độ phức tạp của thuật
toán xấp xỉ bằng 𝑂(𝑛 log 4 𝑛)
2.11. Thuật toán Counting Sort
2.11.1.Ý tưởng: Áp dụng với mảng chứa các phần tử nguyên không âm, hoặc một
danh sách ký tự được ánh xạ về dạng số thập phân. Counting Sort đếm số
lần xuất hiện của các giá trị khác nhau trong mảng ban đầu và gán giá trị
vừa đếm vào vị trí tương ứng của 1 mảng có độ dài là giá trị lớn nhất của
mảng.
2.11.2.Thuật toán:
2.11.2.1. Bước 1: Tìm 𝑀𝑎𝑥 = max(𝑎𝑟𝑟𝑎𝑦[ ])
2.11.2.2. Bước 2: Tạo mảng động ∗ 𝑆𝑜𝐿𝑢𝑜𝑛𝑔 có độ dài là 𝑀𝑎𝑥 và
𝑆𝑜𝐿𝑢𝑜𝑛𝑔[𝑖] = 0, 𝑖𝑛𝑡 ∗ 𝑆𝑜𝐿𝑢𝑜𝑛𝑔 = 𝑛𝑒𝑤 (𝑖𝑛𝑡 ∗)𝑐𝑎𝑙𝑙𝑜𝑐(𝑀𝑎𝑥, 𝑠𝑖𝑧𝑒𝑜𝑓(𝑖𝑛𝑡))
2.11.2.3. Bước 3: Đếm số lần xuất hiện của các giá trị khác nhau trong mảng
ban đầu. Và gán giá trị vào vị trí tương ứng ở mảng 𝑆𝑜𝐿𝑢𝑜𝑛𝑔
2.11.2.4. Bước 4: Sắp xếp lại mảng ban đầu bằng cách duyệt mảng 𝑆𝑜𝐿𝑢𝑜𝑛𝑔
2.11.3.Đánh giá thuật toán:
Trường hợp Độ phức tạp
Tốt nhất 𝑂(𝑛)
Xấu nhất 𝑂(𝑛)
Trung bình 𝑂(𝑛)
Trường ĐH KHTN – ĐHQG TP.HCM Thực hành CTDL> – Lớp 18CTT2A
ar e_ 00
So d_3 0
d_ 00
Ra om 00
Ra m_ 00
Ne ly S d_1 0
rte 00
Re rse_ 0
Re se_1 0
00
rte 00
te 00
0
Ra om 000
_1 00
So d_3 0
d_ 00
rte 00
ar ort 00
ar rte 00
00
0
rte 00
00
0
00
Ne vers 300
rte 00
nd 10
So 000
00
30
So _10
Ne So 000
om 00
ar ort 00
rte 00
So _10
nd _ 3
Ne ly S d_1
Ne So d_3
Re se_1
So d_3
Re 100
0
10
Ra m_
1
nd _ 3
1
d
e
o
e
ve
ve
o
nd
r
r
ve
ve
nd
Ra
ly
ly
ar
ly