Tải bản đầy đủ (.ppt) (18 trang)

sắp xếp bằng phương pháp chèn

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 (112.37 KB, 18 trang )


S¾p xÕp b»ng ph¬ng ph¸p chÌn
Bài toán: Cho một mảng gồm một dãy các phần tử. Sắp xếp
dãy đó theo qui tắc tăng dần.
Ý tưởng:
-
Áp dụng theo phương pháp lên bài tú lơ khơ. Mỗi lá bài
tương ứng với một phần tử của mảng. Lên từng lá bài một
-
lên lá bài thứ hai ta so sánh với lá bài thứ nhất
-
lên lá bài thứ ba so sánh với lá bài thứ hai và lá bài thứ nhất
-
Cứ như vậy ta sẽ được một dãy sắp xếp tăng dần.
Thuật toán:
Input: Một mảng A gồm các phần tử (khoá) chưa sắp xếp
tăng dần.
Output: Mảng A gồm các phần tử được sắp xếp tăng dần.

S¾p xÕp b»ng ph¬ng ph¸p chÌn
- Phép so sánh được tiền hành bắt đầu từ phần tử thứ 2. gán i
ở pt thứ 2. Như vậy i chạy từ 2 đến n. Với mỗi một giá trị của
i sẽ có j=i-1,i-2, ,i-i lần so sánh. Quá trình chèn xảy ra khi
A[i]<A[j] và A[i]>A[j-1]. Như vậy để đảm bảo cho khoá mới
trong mọi trường hợp kể cả khoá đầu tiên, ta thêm vào một
khoá giả A[0] có giá trị nhỏ hơn tất cả các khoá trong mảng.
Mảng A: 34 45 76 23 17 19 52 56 14
1 2
3
4 5 6 7 8 9 10
15


i
j
-∞
0
Xác định biến:
Như vậy số biến cần dùng là:
i: chạy từ 2 đến n
j: giảm từ i-1 cho đến i-i, dừng khi A[i]>A[j]
x: nhận giá trị của A[i] để đem so sánh

Thủ tục:
Procedure Insertsort;
var i,j,x:integer;
Begin
A[0]:= -∞
for i:=2 to n do
Begin
x:=A[i];
j:=i-1;
while x<A[j] do Begin
A[j+1]:=A[j];
j:=j-1;
End;
A[j+1]:=x;
End;
End;
S¾p xÕp b»ng ph¬ng ph¸p chÌn
Mảng A: 34 45 76 23 17 19 52 56 14
1 2
3

4 5 6 7 8 9 10
15
i
j
-∞
0




S¾p xÕp b»ng ph¬ng ph¸p chÌn
67
3
34
2
i
Mảng A:
1
42
j
-∞
0
Ví dụ: Cho mảng số nguyên gồm các pt: 42,34,67,45,23,65
ứng dụng thuật toán sắp xếp chèn hẵy sắp xếp cho dãy số trên.
Chạy chậm:
42
34
34
2
i

1
34
j
-∞
0
42
i=2
i=3
x=34,j=1
34<42 ->
x=67, j=2
67>42 ->
A[j+1]:=x
x=34,j=0
34> -∞ ->

S¾p xÕp b»ng ph¬ng ph¸p chÌn
i=4
i=5
67
3
34
2
i
1
34
j
-∞
0
42

x=45, j=3
45<67 -> A[j+1]:=A[j] ->
x=45, j=2
45>42 -> A[j+1]:=x ->
45
4
6745
x=23, j=4
23<67 -> A[j+1]:=A[j] ->
x=23, j=3
23<45 -> A[j+1]:=A[j] ->
x=23, j=2
23<42 -> A[j+1]:=A[j] ->
x=23, j=1
23<34 -> A[j+1]:=A[j] ->
x=23, j=0
23> -∞-> A[j+1]:=x ->
23
5
67
3
34
2
i
1
34
j
-∞
0
42

6745
4
6745423423

Bài tập về nhà: Dùng ngôn ngữ lập trình Pascal, sử dụng thuật
toán sắp xếp chèn sắp xếp dãy sau theo chiều giảm dần:
12,89,34,23,56,12
S¾p xÕp b»ng ph¬ng ph¸p chÌn
i=6
x=65, j=5
65<67 -> A[j+1]:=A[j] ->
x=65, j=4
65>45 -> A[j+1]:=x ->
67
3
34
2
i
1
23
j
-∞
0
34
4542
4
67
5
65
6

65 67

Bài toán: Cho một mảng k gồm n phần tử. Hãy sắp xếp các phần tử đó
theo một qui định nào đó.
Ý tưởng:
Bước 1: Từ các phần tử của mảng tạo thành một cây nhị phân
hoàn chỉnh, với mỗi nút có khoá tương ứng với giá trị của phần tử trong
mảng.
Bước 2: Tiến hành tạo thành đống ban đầu đối với các nút trên
cây (Đống được hiểu là môt cây nhị phân hoàn chỉnh mà mỗi nút được
gán giá trị khoá sao cho khoá ở nút cha bao giờ cũng lớn hơn khoá ở nút
con nó).
Bước 3: Sau quá trình tạo đống ta sẽ được một khoá có giá trị
lớn nhất (gọi là khoá trội).
Bước 4: Đưa khoá trội về vị trí n của cây. Bằng cách đổi vị trí
với khoá hiện đang ở vị trí đó.
Bước 5: Vun lại đống mới với số nút là n-i nút (i là số nút trội
được loại bỏ). Quay lại Bước 4.
S¾p xÕp b»ng ph¬ng ph¸p vun ®èng

Ví dụ: Cho mảng gồm: 42 23 74 11 65 58 94 36 99 87
S¾p xÕp b»ng ph¬ng vun ®èng
42
1
2
23
4
11
8 36 9 99
10

87
5
65
6
58
7
94
3
74
1
2 3
4 5 6 7
8 9 10
87
36
94
58 7465
23 11 42
99
- Tạo thành đống ban đầu
- Tạo cây nhị phân hoàn chỉnh:

S¾p xÕp b»ng ph¬ng vun ®èng
1
2 3
4 5 6 7
8 9 10
87
42
36

94
58 7465
23 11 99
- Sắp xếp, loại bỏ khoá trội ra ngoài
Thuật toán:
Ta thấy: một nút lá luôn là một cây con thoả mãn điều kiện
của đống. Như vậy tạo đống hay vun đống ta có thể tạo từ dưới lên.
Đối với cây nhị phân hoàn chỉnh thì nút ứng với [n/2] trở
xuống mới có thể là cha của các nút khác. Vì vậy khi tạo đống ta chỉ
cần tạo từ nút [n/2] trở xuống.
Input: Mảng k gồm các phần tử số nguyên
Output: Sắp xếp lại các phần tử theo chiều tăng dần

To hai th tc: th tc chnh cõy thnh ng v th tc sp xp li ng.
procedure adjust(i,n:integer);
var j,key:integer;
begin
key:=k[i];
while i*2<=n do
begin
j:=i*2;
{Tìm cây con có giá trị lớn nhất}
if (j<n)and(k[j]<k[j+1]) then j:=j+1;
if k[j]<=key then break;
k[i]:=k[j]; {Đổi chỗ Cha-Con}
i:=j;
end;
k[i]:=key; {Đ5a khóa nút Cha về đúng vị trí}
end;
Sắp xếp bằng phơng vun đống

1
2 3
4 5 6 7
8 9 10
87
42
36
94
58 7465
23 11 99

procedure heapsort(var a:mang;n:integer);
var i,tg:integer;
begin
{T¹o ®èng}
for i:=n div 2 downto 1 do
adjust(i,n);
{S¾p xÕp - ®æi chç}
for i:=n downto 2 do
begin
tg:=a[1];a[1]:=a[i];a[i]:=tg;
adjust(1,i-1);
end;
end;
S¾p xÕp b»ng ph¬ng vun ®èng

Cµi ®Æt
procedure heapsort(var a:mang;n:integer);
var i,tg:integer;
procedure adjust(i,n:integer);

var j,key:integer;
begin
key:=a[i];
while i*2<=n do
begin
j:=i*2;
if (j<n)and(a[j]<a[j+1]) then j:=j+1;
if a[j]<=key then break;
a[i]:=a[j];
i:=j;
end;
a[i]:=key;
end;
begin
for i:=n div 2 downto 1 do
adjust(i,n);
for i:=n downto 2 do
begin
tg:=a[1];a[1]:=a[i];a[i]:=tg;
adjust(1,i-1);
end;
end;

Ví dụ: Cho mảng k gồm các phần tử nguyên: 23,67,90,89,12,95.
Dựa vào thuật toán sắp xếp vun đống hãy chạy chậm quá trình
sắp xếp theo chiều tăng dần.
S¾p xÕp b»ng ph¬ng vun ®èng
- Tạo cây nhị phân hoàn chỉnh
23
1

67
2
90
3
95
6
12
5
89
4

for i:=3 down to 1 do call chinh(i,n);
S¾p xÕp b»ng ph¬ng vun ®èng
- Tạo đống ban đầu
i=3 call chinh(3,6);
key=k[i]=90; j=2*i=2*1
i*2<=n<->6<=6
key<k[j]<->90<95->
k[i]:=k[j]<->k[3]=95
i:=j=6
23
67
2
90
3
95
6
12
5
89

4
1
95
90
2*i=12>6 -> k[i]:=key

S¾p xÕp b»ng ph¬ng vun ®èng
i=2 call chinh(2,6);
key=k[i]=67; j=2*i=2*1
i*2<=n<->4<=6
key<k[j]<->67<89->
k[i]:=k[j]<->k[2]=89
i:=j=4
2*i=8>6 -> k[i]:=key
23
67
2
95
3
90
6
12
5
89
4
1
89
67

S¾p xÕp b»ng ph¬ng vun ®èng

i=1 call chinh(1,6);
key=k[i]=23; j=2*i=2*1
i*2<=n<->2<=6
k[j]<k[j+1]-> j:=j+1
key<k[j]<->23<95->
k[i]:=k[j]<->k[1]=95
i:=j=3
2*i=6<=6 -> j:=i*2=6
key<k[j]<->23<90
-> k[i]:=k[j]
i:=j =6
23
89
2
95
3
90
6
12
5
67
4
1 95
2*i=12>6
-> k[i]:=key->k[6]=23
90
23

S¾p xÕp b»ng ph¬ng vun ®èng
- Loại khóa trội và sắp xếp lại

{Sắp xếp}
for i:=n downto 2 do
begin
tg:=k[1];k[1]:=k[i];k[i]:=tg;
adjust(1,i-1);
end;
i=6
x=k[1]=95; k[1]=k[6]=23
k[6]=x=95; call chinh(1,5);
i=4
x=k[1]=90; k[1]=k[5]=12
k[5]=x=90; call chinh(1,4);
i=3
x=k[1]=89; k[1]=k[4]=12
k[4]=x=89; call chinh(1,3);
i=2
x=k[1]=67; k[1]=k[3]=23
k[3]=x=67; call chinh(1,2);
i=1
x=k[1]=23; k[1]=k[2]=12
k[2]=x=23; call chinh(1,1);
95
89
2
90
3
23
6
12
5

67
4
1
95
23
9012
90
23
67
89
1289
12
67
12
67
23
23
12
12 23 67 89 90 95

Bài tập về nhà: Cho mảng A gồm các phần tử nguyên:
45,67,89,23,34,56,91. Dùng ngôn ngữ Pascal và thuật toán sắp
xếp vun đống. Hãy sắp xếp dãy này theo chiều giảm dần.
S¾p xÕp b»ng ph¬ng vun ®èng

×