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