Ý tưởngChia dãy thành [n/2] nhóm dãy con xen kẽ nhau, sắp thứ tự trên từng nhóm riêng biệt sẽ đưa các phần tử về thứ tự đúng tương đối chỉ đúng so với các phần tử trong nhóm, có thể chưa
Trang 2Nội dung báo cáo
• Các thuật toán sắp xếp nội:
Trang 4Ý tưởng
Chia dãy thành [n/2] nhóm (dãy con) xen kẽ nhau, sắp thứ tự trên từng nhóm riêng biệt sẽ đưa các phần tử về thứ tự đúng tương đối (chỉ đúng so với các phần tử trong nhóm, có thể chưa đúng với dãy ban đầu)
Sau đó chia thành [n/2]-2 nhóm xen kẽ, sắp thứ tự trên từng nhóm …
Làm như trên cho đến khi còn 3 nhóm hoặc 2
nhóm thì chia tiếp thành 1 nhóm
Sắp xếp thứ tự trên nhóm cuối cùng sẽ cho ta kết quả
Trang 5Ví dụ
0 1 2 3 4 5
a[0]=5; a[1]=4; a[2]=9; a[3]=6; a[4]=9; a[5]=7;
Trang 12Ví dụ
0 1 2 3 4 5
Trang 20Ví dụ
0 1 2 3 4 5
Dãy đã sắp xếp xong
Trang 21• B10: Lặp lại B4,5,6,7,8,9 đến khi i=N-1;
• B11: Tăng step 1 đơn vị
• B12: Lặp lại B2,3,4,5,6,7,8,9,10 đến khi
step=[n/2]-1
Trang 22Chương trìnhvoid ShellSort(int a[], int N, int h[], int k)
{ int step, i,j,x,len;
Trang 24Heap sort
Định nghĩa lô (Heap):
Dãy a[0], a[1], a[2],…., a[n-1] được gọi
là một lô nếu thỏa mãn điều kiện sau :
a[k]>=a[i] với k=(i-1)/2 và 0<=k<i<n
Và khi đó ta nhận thấy rằng :
+ a[0] = max { a[0], a[1],…, a[n-1] }
+ a[j], a[j+1],…, a[n-1] là một lô
với j=(n-1)/2+1
Trang 25Ý tưởng
+ Sắp xếp sao cho mảng a[0], a[1], …., a[n-1] là một lô Khi đó a[0] là phần tử lớn nhất của mảng
+ Hoán vị a[0] và a[n-1]
+ Lặp lại hai bước này với mảng mới là ( a[0], a[1],…., a[n-2] ), …
+ Cứ tiếp tục cho đến hết mảng
Trang 26Ví dụ
0 1 2 3 4 5
Trang 27Ví dụ
0 1 2 3 4 5
l=2 r=5i=2 j=2*i+1=5 x=a[2]=7
a[5]=6<x
Trang 29Ví dụ
0 1 2 3 4 5
l=1 r=5i=4 j=9 >r
Trang 30Ví dụ
0 1 2 3 4 5
l=0 r=5i=0 j=1 x=13
a[1]=31, a[2]=7 j=1, a[1]>x
Trang 31Ví dụ
0 1 2 3 4 5
l=0 r=5i=1 j=3 x=13
a[3]=11,a[4]=22 j=4, a[4]>x
Trang 32Ví dụ
0 1 2 3 4 5
l=0 r=5i=4 j=9>r
Trang 33Ví dụ
0 1 2 3 4 5
l= -1 r=5/* Tạo Heap xong */
/* Hoán vị a[0] với a[r] */
Trang 34Ví dụ
0 1 2 3 4 5
Trang 38/* Tạo xong Heap */
/* Hoán vị a[0] với a[r] */
Trang 39
Ví dụ
0 1 2 3 4 5
Trang 41Ví dụ
0 1 2 3 4 5
l= -1 r=3
/* Tạo Heap xong */
/* Hoán vị a[0] với a[r] */
Trang 42Ví dụ
0 1 2 3 4 5
Trang 44Ví dụ
0 1 2 3 4 5
l=0 r=2
/* Tạo Heap xong */
/* Hoán vị a[0] với a[r] */
Trang 45Ví dụ
0 1 2 3 4 5
Trang 47Ví dụ
0 1 2 3 4 5
l= -1 r=1
/* Tạo Heap xong */
/* Hoán vị a[0] với a[r] */
Trang 48Ví dụ
0 1 2 3 4 5
r=0
Trang 49Ví dụ
0 1 2 3 4 5
/*Kết thúc*/
Trang 50Thuật toán Heap sort
• Bước 1: Cho r = n-1.
• Bước 2: Cho l = (n-1)/2.
• Bước 3: Thêm a[l] vào lô a[l+1], a[l+2], , a[r] để tạo thành lô a[l], a[l+1],…,a[r]
+ Bước 3.1: Cho i=l, j=2*i +1, x=a[i]
+ Bước 3.2: Nếu j<r và a[j] < a[j+1] thì tăng j
Trang 51
+ Bước 3.4: Ngược lại thì:
+ Hoán vị a[i] và a[j]
+ Cho i=j
+ Bước 3.5: Lặp lại B3.2, B3.3, B3.4 đến khi j>r
• Bước 4: Giảm l.
Trang 52• Bước 5: Lặp lại B3,B4 đến khi l<0.
• Bước 6: Hoán vị a[0] và a[r].
• Bước 7: Giảm r.
• Bước 8: Cho l=0.
• Bước 9: Làm B3.
• Bước 10: Lặp lại B6,B7 cho đến khi r=0.
• Bước 11: Xuất kết quả.
Trang 54
Void Heapsort ( int a[], int n)
Trang 55Void CreateHeap ( int a[], int n)
Trang 56Void Shift ( int a[], int l, int r )
Trang 58Merge Sort
Để sắp xếp dãy a[0], a[1],….,a[n-1]
giải thuật Merge Sort dựa trên nhận xét
sau:
+Mỗi dãy bất kì đều có thể xem là tập hợp các dãy con liên tiếp mà mỗi dãy con đều có thứ tự VD: dãy (12,3,5,6,1) có thể xem là 3 dãy con (12), (3,5,6), (1)
+Dãy có thứ tự xem như là một
dãy con
Trang 59Ý tưởng
nguyên tắc phân phối đều luân phiên.
một dãy con của dãy ban đầu, ta nhân được dãy ban đầu với số lượng dãy con giảm đi
một nửa.
ban đầu nhưng chỉ có một dãy con.
Trang 6012 2 8 5 1 6 4 15
Trang 66
1 2 4 5 6 8 12 15
Trang 67Thuật toán
dãy b,c theo nguyên tắc luân phiên từng nhóm k phần tử:
vào a theo nguyên tắc phần tử nhỏ xếp trước
dừng.
Trang 69Void Merge sort()
{ int p,pb,pc; int i,k=1;
do { p=pb=pc=0;
while (p<n) { for (i=0;(p<n)&&(i<k);i++)
b[pb++]=a[p++];
for (i=0;(p<n)&&(i<k);i++) c[pc++]=a[p++]; };
Merge(a,pb,pc,k);
k*=2;
} while ( k<n );
}
Trang 70void Merge (int a[], int nb, int nc, int k)
{ int p, pb, pc, ib, ic, kb, kc;
Trang 71}
}
}
Trang 73Giới thiệu
Các giải thuật sắp thứ tự mảng nói trên đươc thực hiện với giả thiết mảng có kích thước đủ nhỏ để được nạp toàn bộ vào bộ nhớ Nhưng nếu tập tin chứa nhiều mẫu tin và mỗi
mẫu tin có chiều dài tương đối lớn thì
ta không thể nạp toàn bộ tập tin vào
bộ nhớ chính để sắp thứ tự.
Trang 74Ý tưởng
• Ta phân chia tập tin cần sắp xếp thành các tập tin nhỏ hơn có số lượng mẫu tin mà bộ nhớ chính có thể chứa chúng
• Sau đó nạp chúng vào bộ nhớ chính rồi
dùng phương pháp sắp thứ tự nội để sắp xếp chúng lại thành các mạch (run)
• Trộn các mạch (run) lại và đưa vào tập tin cần sắp xếp
• Thực hiện như vậy cho đến khi tập tin
được sắp xếp xong
Trang 75Sắp xếp trên tập tin theo kiểu trộn
tự nhiên (Natural Merge-Sort)
• B5:Thực hiện lại các bước trên cho đến khi nào
F đã có thứ tự.
Trang 76F2: 2 0 9 4 18 1 4
Trang 77F2: 0 1 1 7 9 16 0 1 4 6 9 14
Trang 78F2:0 1 4 4 6 9 11 14 18