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]
(1)Giảng viên: TS Ngo Huu Phuc Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@gmail.com
Cấu trúc liệu giải thuật
(2)Nội dung:
7.1 ShellSort (8) 7.2 MergeSort (9) 7.3 BucketSort (5) 7.4 RadixSort (6)
Tham khảo:
1. Bucket sort.htm 2. Merge Sort.htm 3. Radix sort.htm 4. ShellSort.htm
(3) Phương pháp Donald Shell giới thiệu
năm 1959.
Với phương pháp xếp chèn: thực phép tốn so sánh, sử dụng nhiều phép di
chuyển thừa.
Với phương pháp xếp chọn: thực phép toán di chuyển, sử dụng nhiều phép so
sánh.
(4) Phương pháp xếp ShellSort gọi
phương pháp xếp giảm độ tăng - diminishing increment sort.
Phương pháp sử dụng dãy tăng: h1, h2, ht
Dãy tăng 1, tối đa đến N-1 (trong thực tế đến N/2) Chưa có đề xuất dãy tốt nhất.
Trong dãy này, không nên chọn số bội nhau.
(5) Ví dụ: với 13 phần tử, dãy khoảng cách 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
(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);
(7)void 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;
(8) Tính hiệu thuật tốn ShellSort? Phụ thuộc vào mảng khoảng cách.
Dạng mặc định, Shell đề xuất: ht = N/2, hk = hk+1/2 …
(9) Dãy khoảng cách Hibbards: Hk = 2k-1 i.e 1, 3, 7,
Độ phức tạp: O(N1.5)
Dãy khoảng cách Sedgewicks:
Có một số dạng giới thiệu, tiếng đó có dạng:
9 * 4i – * 2i + 1, 4i – * 2i + 1
(10) Độ phức tạp ShellSort trường hợp tồi nhất:
O(N2)
Độ phức tạp ShellSort trường hợp tốt nhất:
~ O(N)
Độ phức tạp ShellSort trường hợp trung