Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 1
Đỗ Bích Diệp - Khoa CNTT
Cấutrúcdữ liệuvàGiảithuật
Chương VI: Sắpxếp
7 2 ⏐ 9 4 → 2 4 7 9
7 ⏐ 2 → 2 7 9 ⏐ 4 → 4 9
7 → 7 2 → 2 9 → 9 4 → 4
Đỗ Bích Diệp - Khoa CNTT
Chương VI: Sắpxếp
z Nội dung
1. Bài toán sắpxếp
2. Ba phương pháp sắpxếpcơ bản
1. Lựachọn, thêm dầnvàđổichỗ
2. Phân tích, đánh giá
3. Sắpxếpkiểu hòa nhập
4. Sắpxếp nhanh
5. Sắpxếpkiểuvunđống
6. Mộtsố phương pháp sắpxếp đặcbiệt
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 2
Đỗ Bích Diệp - Khoa CNTT
Bài toán Sắpxếp
– Sắpxếplạimộttập các phầntử dữ liệu theo chiều
tăng dầnhoặcgiảmdần
23 78 45 8 32 56
8 23 32 45 78 56
Đỗ Bích Diệp - Khoa CNTT
Bài toán Sắpxếp
– Khóa sắpxếp
z Mộtbộ phậncủabản ghi biểudiễn đốitượng đượcsắp
z Khóa sẽ đượcsử dụng để xác định thứ tự sắpxếpbản ghi
trong mộttậpcácbảnghi
– Bảng khóa:
z Sử dụng trong sắpxếpkhimuốnhạnchế việcdichuyểncác
bảnghidữ liệu
z Mộttậpcácbản ghi chỉ chứa hai trường
– Khóa: chứa khóa sắpxếp
– Link: Con trỏ ghi địachỉ củabản ghi đốitượng dữ liệutương ứng
z Thứ tự các bản ghi trong bảng khóa cho phép xác định thứ tự
củacácbản ghi dữ liệu
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 3
Đỗ Bích Diệp - Khoa CNTT
Các loạithuậttoánSắpxếp
ExchangeSelectionInsertion
Internal
External
Sorts
•Insertion
•Shell
• Selection
•Heap
• Bubble
•Quick
• Natural
• Balanced
• Polyphase
Đỗ Bích Diệp - Khoa CNTT
Bài toán Sắpxếp
– Các đặctrưng củathuật toán sắpxếp
z Tính ổn định củathuật toán sắpxếp
– Các phầntử có cùng khóa sẽ giữ nguyên thứ tự tương
đốicủa chúng như trướckhisắpxếp
z Tính tạichỗ
– Thuật toán đòi hỏi không gian nhớ phụ là hằng số (không
phụ thuộcvàosố lượng phầntử trong dãy cầnsắp)
78 8 45 8 32 56 8 8 32 45 56 78
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 4
Đỗ Bích Diệp - Khoa CNTT
Bài toán Sắpxếp
– Trong chương này, bài toán sắpxếp được đơn
giảnhóadướidạng như sau
z Đầu vào: Một dãy các số nguyên a
1
, a
2
, …, a
n
z Đầura: Một hoán vị củadãysốđãchotrongđó các giá
trịđượcsắpxếp theo chiềutăng dần
Đỗ Bích Diệp - Khoa CNTT
Ba phương pháp sắpxếpcơ bản
1. Sắpxếpkiểulựachọn (Selection Sort)
2. Sắpxếpkiểu thêm dần (Insertion Sort)
3. Sắpxếpkiểu đổichỗ -Sắpxếpkiểunổibọt
(Buble Sort)
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 5
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểulựachọn – Selection Sort
– Ý tưởng:
z Tạimỗilượt, chọn phầntử nhỏ nhất trong số các phần
tử chưa đượcsắp. Đưaphầntửđượcchọnvàovị trí
đúng bằng phép đổichỗ.
z Sau lượtthứ i (i = 1 n-1) , dãy cầnsắp coi nhưđược
chia thành 2 phần
– Phần đãsắp: từ vị trí 1 đếni
– Phầnchưasắp: từ vị trí i +1 đếnn
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểulựachọn
– Ví dụ: Sắpxếp dãy sau theo thứ tự tăng dần:
z A = {12, 5, 3, 10, 18, 4, 9, 16}
1816161616161616
161818109999
1212121212544
1010101818181818
999910101010
5555512123
44444455
333333312
Lượt7Lượt6Lượt5Lượt4Lượt3Lượt2Lượt1
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 6
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểulựachọn
– Giảithuật
Procedure SELECTION-SORT(A,n)
1. for i = 1 to n-1 do begin
2. {Duyệttừđỉnh}
min = i;
3. {Chọnphầntử nhỏ nhất}
for j = i+1 to n do
if A[j] < A[min] then
min = j ;
4. {Đổichổ phầntử i và phầntử nhỏ nhất}
T = A[i]; A[i] = A[min]; A[min] = T;
end;
End.
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểulựachọn
– Thờigianthựchiệnthuật toán
z Trường hợptốtnhất:
– Dãy ban đầu đã đượcsắpxếp
– 0 phép đổichỗ, chỉ thựchiện n(n-1)/2 phép so sánh
z Trường hợpxấunhất
– n-1 phép đổichỗ, n(n-1)/2 phép so sánh
–
Độ phứctạpthời gian trung bình O(n
2
)
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 7
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểuthêmdần – Insertion sort
z Ý tưởng:
– Dãy cầnsắp được chia thành 2 phần: mộtlàphần đã
sắp, còn lạilàphầnchưasắp
– Tạimỗilượt, phầntửđầu tiên trong phầnchưasắpsẽ
được “thêm” vào đúng vị trí của nó trong phần đãsắp.
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểuthêmdần
– Ví dụ: Sắpxếp dãy sau theo thứ tự tăng dần:
z A = {12, 5, 3, 10, 18, 4, 9, 16}
1816161616161616
1618999999
12121844444
1010121818181818
99101212101010
55510101233
444555125
333333512
Lượt7Lượt6Lượt5Lượt4Lượt3Lượt2Lượt1
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 8
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểuthêmdần
– Giảithuật
Procedure INSERTION-SORT(A,n)
1. for i := 2 to n do begin
2. {Chọnphầntửđầutiêncủaphầnchưa đượcsắpxếp}
val := A[i];
j := i;
{Tìm vị trí thích hợp đề chèn phầntử A[i] trong phần đãsắp- chứacácphầntử từ
vị trí 1 đếni-1}
while ( j > 1) and (A[j-1] > val) do
begin
A[j] := A[j-1]; j := j -1;
end;
4. {Chèn phầntử A[i] vào vị trí thích hợp}
A[j] := val; end;
5. End
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểuthêmdần
– Sắpxếp thêm dầnlàtạichỗ và ổn định
– Thờigianthựchiệngiảithuật
z Trường hợptốtnhất:
– Dãy ban đầu đã đượcsắpxếp
– 0 thựchiệnphépđổichỗ, n-1 phép so sánh
z Trường hợpxấunhất
– n(n-1)/2 phép đổichỗ và so sánh
–
Độ phứctạpthời gian trung bình O(n
2
)
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 9
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểunổibọt
– Ví dụ
z A = {12, 5, 3, 10, 18, 4, 9, 16}
1818181818161616
16161616161899
121212101010184
10101012991018
9999125410
555551253
444444125
333333312
Lượt7Lượt6Lượt5Lượt4Lượt3Lượt2Lượt1
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểunổibọt
z Ý tưởng:
– Dãy cầnsắp được chia thành 2 phần: mộtlàphần đã
sắp, còn lạilàphầnchưasắp
– Thông qua phép đổichỗ, tạimỗilượtphầntử nhỏ nhất
trong phầnchưa đượcsắpsẽđược“đẩydần” lên trước
và cuốicùngnhậpvàophần đượcsắp
.
Phầnchưasắp
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 10
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểunổibọt
– Giảithuật
Procedure BUBBLE-SORT(A,n)
1. for i := 1 to n-1 do
2. {Duyệttừđáy}
for j:= n down to i+1 do
3. {Kiểmtra2 phầntử kề cận nhau, nếungượcthứ tự thì đổichỗ }
if A[j] < A[j-1] then
begin
X:= A[j];
A[j] := A[j-1];
A[j-1] := X;
end
4. return
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểunổibọt
– Thờigianthựchiệngiảithuật
z Trường hợptốtnhất:
– Dãy ban đầu đã đượcsắpxếp
– 0 thựchiệnphépđổichỗ, n(n-1)/2 phép so sánh
z Trường hợpxấunhất
– n(n-1)/2 phép đổichỗ và so sánh
–
Độ phứctạpthời gian trung bình O(n
2
)
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 11
Đỗ Bích Diệp - Khoa CNTT
Sắpxếp Nhanh (Quick Sort)
– Được đưarabởi C. A. Hoare (1962).
– Là phương pháp sắpxếpdựatrênchiếnlượcchiađể trị
z Trường hợpcơ sở: Dãy chỉ có 1 phầntử, dãy đã đượcsắp
z Chia – Pha phân đoạn
– Chọnmộtphầntử trong dãy làm phầntử chốtp
– Chia dãy đã cho thành 3 nhóm : <p ; p ; >=p
z Trị:
– Sắpxếp đượctiếptụcmộtcáchđệ qui với nhóm thứ 1 và nhóm
thứ 3
p
< p
>=
p
Chốt
Đỗ Bích Diệp - Khoa CNTT
Sắpxếp nhanh
Procedure QUICK-SORT(A, left, right)
{A là mảng cầnsắp, left là chỉ số củaphầntửđầu , right là chỉ số củaphầntử cuối}
1. if left < right then begin
p = PARTITION(A,left, right) ;
QUICK-SORT(A, left, p-1);
QUICK-SORT(A, p+1,right);
end;
2. return.
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 12
Đỗ Bích Diệp - Khoa CNTT
Sắpxếp nhanh
– Pha phân đoạn – Partition
z Hàm Partition thựchiện chia dãy đầu vào A[left right]
thành 2 đoạn
– A[left, p-1] gồm các phầntử nhỏ hơnhoặcbằng A[p]
– A[p+1, right] gồm các phầntử lớnhơnhoặcbằng A[p]
z Gồm hai công đoạnchính
– Lựachọnchốt
– Thựchiện Phân đoạn
Đỗ Bích Diệp - Khoa CNTT
Sắpxếp nhanh
– Lựachọnchốt
z Chọnchốtlàphầntửđứng đầuhoặccuối danh sách
z Chọnphầntửđứng giữa danh sách làm chốt
z Chọnphầntử trung vị trong 3 phầntửđứng đầu, đứng
giữavàđứng cuối danh sách
z Chọnphầntử ngẫu nhiên
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 13
Đỗ Bích Diệp - Khoa CNTT
Sắpxếp nhanh
– Phân đoạn
Chốt
Chốt
Vị trí trái
Vị trí phải
Đỗ Bích Diệp - Khoa CNTT
Sắpxếp nhanh
– Giảithuậtcủa pha phân đoạn
Function PARTITION-LEFT(A, left, right)
{A là mảng cầnsắp, left là chỉ số củaphầntửđầu , right là chỉ số củaphầntử cuối.
Phầntử chốtlàphầntửởđầu danh sách}
1. i:=left + 1; j := right; pivot = left // i là khởi đầucủavị trí trái, j là khởi đầucủa
vị trí phải
2. { Tiếnhànhduyệt, so sánh, đổichỗđểhình thành phân đoạn}
while ( i<=j) do begin
while (A[i] < A[pivot]) do i := i+1;
while (A[j] > A[pivot]) do j:= j-1;
if i < j then begin A[i] <-> A[j]; i := i+1; j := j -1; end
end
3. {Đưachốtvề vị trí thựcgiữa2 phânđoạn, lưuvị trí thự
ccủaphầntử chốt}
k:= j; A[pivot] <-> A[j];
4. Return k
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 14
Đỗ Bích Diệp - Khoa CNTT
Sắpxếp nhanh
78 21 14 97 87 62 74 85 76 45 84 22
78 21 14 97 87 62 74 85 76 45 84 22
78 21 14 22 87 62 74 85 76 45 84 97
78 21 14 22 87 62 74 85 76 45 84 97
Chọnchốt
i = 4 và j = 12, đổichỗ
i = 5 và j = 10, đổichỗ
Đỗ Bích Diệp - Khoa CNTT
Sắpxếp nhanh
78 21 14 22 45 62 74 85 76 87 84 97
78 21 14 22 45 62 74 85 76 87 84 97
78 21 14 22 45 62 74 76 85 87 84 97
i = 8 và j = 9, đổichỗ
i = 9 và j = 8
Kết thúc phân đoạn
Đưachốtvề vị trí thực
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 15
Đỗ Bích Diệp - Khoa CNTT
Sắpxếp nhanh
Function PARTITION-MID(A, left, right)
{A là mảng cầnsắp, left là chỉ số củaphầntửđầu , right là chỉ số củaphầntử cuối.
Phầntử chốtlàphầntửởđầu danh sách}
1. i:=left ; j := right; pivot = [(left + right ) /2 ]
{pivot là số nguyên >= (left+right)/2}
2. repeat
while (A[i] < A[pivot]) do i := i+1;
while (A[j] > A[pivot]) do j:= j-1;
if i <= j then begin A[i] <-> A[j]; i := i+1; j := j -1; end
until i > j
4. Return j
Đỗ Bích Diệp - Khoa CNTT
Đánh giá giảithuậtSắpxếp nhanh
– Sắpxếp nhanh là tạichỗ nhưng không ổn định
– Thờigianthựchiệngiảithuật
z Trường hợptổng quát
– T(0) = T(1) = c
– Pha phân đoạn đượcthựchiệnbằng việcduyệtdanh
sách ban đầu1 lần Æ ThờigianthựchiệnlàO(n)
– Trong giảithuậtxuấthiện2 lờigọi đệ qui: Giả sử sau khi
phân đoạn, phầntử chốt ở vị trí p thì
T(n) = T(p-1) + T(n-p) + O(n) + O(1)
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 16
Đỗ Bích Diệp - Khoa CNTT
Đánh giá giảithuậtSắpxếp nhanh
z Trường hợpxấunhất:
– Công thức đệ qui: T(n) = T(n-1) + O(n) + O(1)
– Độ phứctạpcủagiảithuậtsắpxếp nhanh là O(n
2
) khi A
vốn đã đượcsắpvàchốt đượcchọnlànútnhỏ nhất
z Trường hợp hoàn hảo:
– Phân đoạncânbằng T(n) = 2 T(n/2) + n
– Độ phứctạp trung bình củagiảithuậtlàO(nlog
2
n)
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập
z Tương tự như sắpxếp nhanh dựavàocơ chế chia để trị
để thựchiệnsắpxếp.
z Bao gồm3 bước
– Chia: Phân chia dãy cần đượcsắpS gồmn phầntử
thành 2 dãy con vớisố phầntử là n/2 S
1
và S
2
– Tri: Lầnlượtsắpxếp hai dãy con S
1
và S
2
bằng sắpxếp
kiểuhòanhập
– Tổ hợp: Nhập 2 dãy con đã đượcsắpS
1
và S
2
thành một
dãy duy nhất
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 17
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập
Algorithm MERGE-SORT(S, n)
{S là dãy cần đượcsắpxếp, n là số phầntử trong dãy}
1. if ( n< 2) then return S;
2. {Chia: TạodãyS1 chứa n div 2 phầntửđầu tiên củaS, TạodãyS2 chứa các
phầntử còn lại trong S sau khi đãlấyracácphầntử trong S1}
(S1, S2) = PARTITION(S, n div 2)
3. {Lặp}
1. MERGE-SORT(S1, (n div 2));
2. MERGE-SORT(S2, (n- (n div 2));
4. {Trị- Hòa nhậphaidãyđượcsắp}
MERGE(S1,S2, S);
5. Return S;
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập–Vídụ minh họa
z Chia
7 2 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6
7 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6
7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1
7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 18
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập-Vídụ minh họa
z Lờigọi đệ qui - Chia
7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6
7 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6
7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1
7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập-Vídụ minh họa
z Lờigọi đệ qui - Chia
7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6
7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6
7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1
7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 19
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập-Vídụ minh họa
z Lờigọi đệ qui – Trường hợpcơ sở
7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6
7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6
7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1
7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập-Vídụ minh họa
z Lờigọi đệ qui – Trường hợpcơ sở
7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6
7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6
7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1
7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 20
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập-Vídụ minh họa
z Hòa nhập
7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6
7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6
7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1
7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập-Vídụ minh họa
z Lờigọi đệ qui …. Trường hợpcơ sở , Hòa nhập
7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6
7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6
7 → 7 2 → 2 3 → 3 8 → 8 6 → 6 1 → 1
7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9
9 → 9 4 → 4
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 21
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập-Vídụ minh họa
z Hòa nhập
7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 8 6
7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6
7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1
7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập-Vídụ minh họa
z Tương tự ….
7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 6 8
7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6
7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1
7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 22
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập-Vídụ minh họa
z Hòa nhậplầncuối
7 2 ⏐ 9 4 → 2 4 7 9 3 8 6 1 → 1 3 6 8
7 ⏐ 2 → 2 7 9 4 → 4 9 3 8 → 3 8 6 1 → 1 6
7 → 7 2 → 2 9 → 9 4 → 4 3 → 3 8 → 8 6 → 6 1 → 1
7 2 9 4 ⏐ 3 8 6 1 → 1 2 3 4 6 7 8 9
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập
z Giảithuật: Hòa nhập hai dãy đã đượcsắpxếp
Procedure MERGE(A, B, C)
{A, B là hai dãy đãsắpvớisố phầntử lầnlượt là sizea và sizeb, C là dãy hợpnhất
củaA vàB}
1. i:= 1; j:=1; k:=1 ; {khởitạo các chỉ số trên 3 dãy A,B,C}
2. { Tiếnhànhduyệt A và B, duyệt song song hai dãy cho đếnkhimột trong hai
dãy kếtthúc}
while ( i<=sizea and j <= sizeb) do
if A[i] < B[j] then begin
C[k] := A[i]; i := i+1; k:= k+1;
end;
else begin C[k] := B[j] ; j := j+1; k:= k+1 ;
end;
end;
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 23
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập
3. { NếudãyA hết}
if i > sizea {dãy A đãhết} then for t:= 0 to sizeb – t do C[k+t] := B[j+t];
4. else { dãy B hết} for t:= 0 to sizea – t do C[k+t] := A[i+t];
5. return.
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểu hòa nhập
– Thờigianthựchiệngiảithuật
z T(n) = 2 T(n/2) + n
– Độ phứctạp trong tình huống xấunhấtvàtrung
bình là O(n log
2
n)
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 24
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểuvunđống
– CấutrúcĐống
– Đống là một cây nhị phâncóhaitínhchất
z Là cây nhị phân hoàn chỉnh
z Có thứ tự : mỗi nút đượcgắnvớimộtgiátrị số tự
nhiên, sao cho giá trị của nút cha bao giờ cũng lớn
hơngiátrị của nút con (Max Heap)
87
65
33
45 23 18 5
27 9 12
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểuvunđống
– Đống đượclưutrữ trong máy tính dướidạng mộtvector
lưutrữ
V[10]V[9]V[8]V[7]V[6]V[5]V[4]V[3]V[2]V[1]
129275182345336587
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp -Khoa CNTT - ĐHBKHN 25
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểuvunđống
z Phép tạo đống
– Dãy số cầnsắp đượccoilàdãycácphầntử củamộtcâynhị
phân hoàn chỉnh đượclưutrữ kế tiếp
z Dãy số A: {31, 54, 21, 11, 79, 47, 28, 87, 69, 65, 51}
z Vector lưutrữ
V[1]
31
V[2]
54
V[3]
21
V[4]
11
V[5]
79
V[6]
47
V[7]
28
V[8]
87
V[9]
69
V[10]
65
V[11]
51
Đỗ Bích Diệp - Khoa CNTT
Sắpxếpkiểuvunđống
z Cây nhị phân hoàn chỉnh tương ứng
31
54
21
11 79 47 28
87 69 65
51
1
23
4
5
6
7
8
9
10
11