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ử.. 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
Trang 1Sắ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
Trang 2Sắ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
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]
Trang 3Thủ 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;
Sắp xếp bằng phương pháp chèn
Mảng A: 34 45 76 23 17 19 52 56 14
15
i
j
- ∞
0
Trang 4
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> - ∞ ->
Trang 5Sắ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
67 45
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 45 67
4
67 45
42 34
23
Trang 6Bà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 42 45
4
67
5
65
6
65 67
Trang 7Bà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
Trang 8Vớ 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
1
87
36
94
65
23 11 42
99
- Tạo thành đống ban đầu
- Tạo cõy nhị phõn hoàn chỉnh:
Trang 9Sắp xếp bằng phương vun đống
1
87
42
36
94
65
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
Trang 10Tạo hai thủ tục: thủ tục chỉnh cõy thành đống và thủ tục sắp xếp lại đố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;
Sắp xếp bằng phương vun đống
1
87
42
36
94
65
23 11 99
Trang 11procedure 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
Trang 12Cà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;
Trang 13Vớ 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
95
6
12
5
89
4
Trang 14for 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
95
6
12
5
89
4
1
95
90
2*i=12>6 -> k[i]:=key
Trang 15Sắ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
90
6
12
5
89
4
1
89
67
Trang 16Sắ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
90
6
12
5
67
4
1 95
2*i=12>6
-> k[i]:=key->k[6]=23
90
23
Trang 17Sắ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
i=3 x=k[1]=89; k[1]=k[4]=12
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
23
6
12
5
67
4
1
95
23
90
23 67
89
12
12
23
23
12
12 23 67 89 90 95
Trang 18Bà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