Tải bản đầy đủ (.pdf) (10 trang)

Cấu trúc dữ liệu và giải thuật (phần 3) pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (196.19 KB, 10 trang )

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

×