V ới phương pháp sắp xếp chọn: thực hiện ít phép toán di chuy ển, nhưng sử dụng nhiều phép so. sánh[r]
Trang 1Gi ảng viên: TS Ngo Huu Phuc
Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@gmail.com
C ấu trúc dữ liệu và giải thuật
Bài 7 Các phương pháp sắp xếp khác
Trang 2N ội dung:
7.1 ShellSort (8)
7.2 MergeSort (9)
7.3 BucketSort (5)
7.4 RadixSort (6)
1 Bucket sort.htm
2 Merge Sort.htm
3 Radix sort.htm
4 ShellSort.htm
5 Bài gi ảng của TS Nguyên Nam Hồng
Trang 3 Phương pháp này được Donald Shell giới thiệu năm 1959.
V ới phương pháp sắp xếp chèn: thực hiện ít phép toán so sánh, nhưng sử dụng nhiều phép di
chuy ển thừa.
V ới phương pháp sắp xếp chọn: thực hiện ít phép toán di chuy ển, nhưng sử dụng nhiều phép so
sánh.
ể có phương pháp hiệu quả hơn không?
Trang 4 Phương pháp sắp xếp ShellSort còn được gọi là
phương pháp sắp xếp giảm độ tăng - diminishing
increment sort.
Phương pháp sử dụng một dãy tăng: h 1 , h 2 , h t
Dãy t ăng được bắt đầu từ 1, tối đa đến N-1 (trong thực
t ế đến N/2) Chưa có đề xuất dãy như thế nào tốt nhất.
Trong dãy này, không nên ch ọn các số là bội của nhau.
Dãy này còn được gọi là dãy khoảng cách, ví dụ 1,3,5.
Trang 5 Ví d ụ: với 13 phần tử, dãy khoảng cách là 1,3,5
STT 0 1 2 3 4 5 6 7 8 9 10 11 12
Ban
đầu 81 94 11 96 12 35 17 95 28 58 41 75 15
KC
= 5 35 17 11 28 12 41 75 15 96 58 81 94 95
KC
= 3 28 12 11 35 15 41 58 17 94 75 81 96 95
KC
= 1 11 12 15 17 28 35 41 58 75 81 94 95 96
Trang 6#include <conio.h>
#define MAX 100
void inputdata(int* list,int n);
void printlist(int* list,int n);
void shellsort(int*list, int n, int *incs, int t);
void main() {
int list[MAX], n;
int incs[MAX], t;
printf("Nhap so phan tu cua mang:\n");
scanf("%d",&n);
inputdata(list,n);
printf("Mang da nhap:\n");
printlist(list,n);
printf("Nhap so phan tu cua mang khoang cach:");
scanf("%d",&t);
printf("Nhap gia tri cua mang khoang cach:");
scanf("%d",&incs[i]);
shellsort(list,n,incs,t);
printf("Mang da sap xep:\n");
printlist(list,n);
getch();
}
void inputdata(int* list,int n) {
int i;
printf("Nhap cac phan tu cua mang\n"); for(i=0;i<n;i++)
scanf("%d",&list[i]);
fflush(stdin);
}
Trang 7void printlist(int* list,int n)
{
int i;
printf("Cac phan tu cua mang: \n");
for(i=0;i<n;i++)
printf("%d\t",list[i]);
printf("\n");
}
void shellsort(int*list, int n, int *incs, int t) {
inti,j,k,h;
inttemp;
for(k=t-1; k>0; k )
for(h=incs[k], i=h; i<n; i+=h) { temp=list[i];
j=i;
while(j>=h && list[j-h]>temp) {
list[j]=list[j-h]; j-=h;
} list[j]=temp;
}
Trang 8 Tính hi ệu quả của thuật toán ShellSort?
Ph ụ thuộc vào mảng khoảng cách.
D ạng mặc định, do Shell đề xuất:
h t = N/2, h k = h k+1 /2 …
Độ phức tạp của thuật toán - O(N 2 )
Trang 9 Dãy kho ảng cách của Hibbards:
H k = 2 k -1 i.e 1, 3, 7,
Độ phức tạp: O(N 1.5 )
Dãy kho ảng cách của Sedgewicks:
Có m ột số dạng được giới thiệu, nổi tiếng trong
đó có 2 dạng:
9 * 4 i – 9 * 2 i + 1, và 4 i – 3 * 2 i + 1
Độ phức tạp: O(N 4/3 )
Trang 10 Độ phức tạp của ShellSort trong trường hợp tồi nhất:
O(N 2 )
Độ phức tạp của ShellSort trong trường hợp tốt nhất:
~ O(N)
Độ phức tạp của ShellSort trong trường hợp trung
bình: ~ O(N 7/6 )