1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

18 384 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 371 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

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

Trang 2

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

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 3

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;

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 5

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

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 6

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 42 45

4

67

5

65

6

65 67

Trang 7

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

Trang 8

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

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 9

Sắ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 10

Tạ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 11

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

Trang 12

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;

Trang 13

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

95

6

12

5

89

4

Trang 14

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

95

6

12

5

89

4

1

95

90

2*i=12>6 -> k[i]:=key

Trang 15

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

90

6

12

5

89

4

1

89

67

Trang 16

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

90

6

12

5

67

4

1 95

2*i=12>6

-> k[i]:=key->k[6]=23

90

23

Trang 17

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

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 18

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

Ngày đăng: 25/01/2015, 18:50

TỪ KHÓA LIÊN QUAN

w