Please purchase a Please purchase a personal license. personal license. SHELL SORT SHELL SORT Ôn t Ôn t ậ ậ p Insertion sort p Insertion sort Ý tưởng của thuật toán: • Giả sử dãy {a 0 ,a 1 ,…a n-1 } có k phần tử đầu tiên {a 0 ,a 1 ,…a k-1 } đã có thứ tự. • Chèn phần tử a k vào dãy đã có thứ có dãy mới {a 0 ,a 1 ,…,a k-1 ,a k } có thứ tự. • Vị trí cần chèn a k chính là giữa 2 phần tử a i-1 và a i sao cho a i-1 ≤ a k ≤ a i Ôn t Ôn t ậ ậ p Insertion sort p Insertion sort Ví dụ: A = { 5 8 6 3 10 } Ban đầu mảng A có {5} đã sắp xếp 1. Chèn 8 vào {5} {5,8} 2. Chèn 6 vào {5,8} {5,6,8} 3. Chèn 3 vào {5,6,8} {3,5,6,8} 4. Chèn 10 vào {3,5,6,8} {3,5,6,8,10} Ôn t Ôn t ậ ậ p Insertion sort p Insertion sort Code: void Insertion_sort (int a[], int n) { for (int i=1;i<n;i++) { int x=a[i]; for ( int k =i; (k>0)&&(a[k-1]>x);k ) a[k]=a[k-1]; a[k]=x; } } Shell sort Shell sort Giới thiệu: – Được phát minh bởi Donald L.Shell vào năm 1959 – Shell sort là thuật toán hiệu quả nhất trong nhóm các thuật toán sắp xếp có độ phức tạp O(n 2 ). – Shell sort là sự cải tiến của Insertion sort dựa vào hai nhận xét sau đây: • Insertion sort s ẽ r ấ t hi ệ u qu ả n ế u d ữ li ệ u đầ u vào h ầ u nh ư đ ã đượ c s ắ p x ế p ( đ ã đượ c x ế p trong t ừ ng kho ả ng c ụ c b ộ ). • Insertion sort ho ạ t độ ng kém hi ệ u qu ả vì nó di chuy ể n các giá tr ị ph ầ n t ử m ỗ i l ầ n ch ỉ m ộ t v ị trí. Shell sort Shell sort Ý tưởng thuật toán: - Thuật toán Shell sort với số bước giảm dần - Chọn khoảng cách giữa các bước d = n; d=(d+1)/2 - Phân chia dãy ban đầu thành các dãy con cách nhau d khoảng - Sắp xếp từng dãy con bằng Insertionsort Shell sort Shell sort Cài đặt thuật toán: void ShellSort (int a[], int n) { int d=n; while (d >=1) { d = (d+1)/2; for (int i=0;i<(n-d);i++) { if (a[i+d]<a[i]) { swap(a[i+d],a[i]) } } } } Shell sort Shell sort Ví dụ: n=8; 16 7 10 1 13 11 3 8 1. d=4 So sánh a[0] =16 > a[4] =13 Swap (a[0],a[4]) 13 7 10 1 16 11 3 8 So sánh a[1] = 7 < a[5] =11 !Swap (a[1],a[5]) 13 7 10 1 16 11 3 8 So sánh a[2] =10 > a[6] = 3 Swap (a[2],a[6]) 13 7 3 1 16 11 10 8 So sánh a[3] =1 < a[7] = 8 !Swap (a[3],a[7]) 13 7 3 1 16 11 10 8 Shell sort Shell sort 13 7 3 1 16 11 10 8 2. d=2 So sánh a[0] =13 > a[2] =3 Swap (a[0],a[2]) 3 7 13 1 16 11 10 8 So sánh a[1] = 7 > a[3] =1 Swap (a[1],a[3]) 3 1 13 7 16 11 10 8 So sánh a[2] =13 < a[4] = 6 !Swap (a[2],a[4]) 3 1 13 7 16 11 10 8 So sánh a[3] =7 < a[5] =11 !Swap (a[3],a[5]) 3 1 13 7 16 11 10 8 So sánh a[4] =16 > a[6] =10 Swap (a[4],a[6]) 3 1 13 7 10 11 16 8 . Donald L.Shell vào năm 1959 – Shell sort là thuật toán hiệu quả nhất trong nhóm các thuật toán sắp xếp có độ phức tạp O(n 2 ). – Shell sort là sự cải tiến của Insertion sort dựa vào hai nhận. a i-1 và a i sao cho a i-1 ≤ a k ≤ a i Ôn t Ôn t ậ ậ p Insertion sort p Insertion sort Ví dụ: A = { 5 8 6 3 10 } Ban đầu mảng A có {5} đã sắp xếp 1. Chèn 8 vào {5} {5,8} 2. Chèn 6 vào {5,8}. {5} đã sắp xếp 1. Chèn 8 vào {5} {5,8} 2. Chèn 6 vào {5,8} {5,6,8} 3. Chèn 3 vào {5,6,8} {3,5,6,8} 4. Chèn 10 vào {3,5,6,8} {3,5,6,8,10} Ôn t Ôn t ậ ậ p Insertion sort p Insertion sort Code: void