3giaithuatsxep t lan

41
CÁC GIẢI THUẬT CÁC GIẢI THUẬT SẮP XẾP SẮP XẾP

Upload: rung-rinh

Post on 11-Apr-2017

144 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 3giaithuatsxep t lan

CÁC GIẢI THUẬT CÁC GIẢI THUẬT SẮP XẾPSẮP XẾP

Page 2: 3giaithuatsxep t lan

SẮP XẾPSẮP XẾPI. Bài toán sắp xếpII. Một số thuật toán sắp xếp

1. Sắp xếp kiểu chọn (Selection Sort)2. Sắp xếp kiểu chèn (Insertion Sort)3. Sắp xếp kiểu nổi bọt (Buble Sort)

Page 3: 3giaithuatsxep t lan

I. Bài toán sắp xếpI. Bài toán sắp xếp• Cho dãy K = (k1, k2, …, kn) gồm n

phần tử gọi là khóa. Giữa hai khóa bất kì có quan hệ “≤”. Bài toán yêu cầu hoán vị các phần tử của K để:

k1 ≤ k2 ≤ k3 ≤… ≤ kn

Page 4: 3giaithuatsxep t lan

II. Một số thuật toán sắp xếpII. Một số thuật toán sắp xếp

1.Sắp xếp kiểu chọn (Selection Sort)

2.Sắp xếp kiểu chèn (Insertion Sort)

3.Sắp xếp kiểu nổi bọt (Buble Sort)

Page 5: 3giaithuatsxep t lan

1. Sắp xếp kiểu chọn 1. Sắp xếp kiểu chọn (Selection Sort)(Selection Sort)

a. Ý tưởng thuật toánb. Mô phỏngc. Cài đặtd. Đánh giá thời gian thực hiện

giải thuật

Page 6: 3giaithuatsxep t lan

a. Ý tưởng thuật toán kiểu chọna. Ý tưởng thuật toán kiểu chọn• Thực hiện n – 1 lượt việc đưa phần tử min

trong dãy hiện hành về vị trí đúng ở đầu dãy:– Lượt 1: Chọn dãy khóa K[1..n] ra khóa min và đảo vị

trí với k1– Lượt 2: Chọn dãy khóa K[2..n] ra khóa min và đảo vị

trí với k2– …– Lượt i: Chọn dãy khóa K[i..n] ra khóa min và đảo vị

trí với ki– …– Lượt n – 1: Chọn dãy khóa K[n-1..n] ra khóa min và

đảo vị trí với K[n-1]

Page 7: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=1

7

7 3 9 2 15 1

Tìm phần tử nhỏ nhất đầu tiên

10 5

min

b. Mô phỏng thuật toán kiểu chọnb. Mô phỏng thuật toán kiểu chọn

Page 8: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=2

8

7 3 9 2 15 10

Tìm phần tử nhỏ nhất trong dãy còn lại

1 5

min

Page 9: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=3

9

7 3 9 5 15 101 2

min

Tìm phần tử nhỏ nhất trong dãy còn lại

Page 10: 3giaithuatsxep t lan

min

1 2 3 4 5 6 7 8

i=4

10

3 7 9 5 15 101 2

Tìm phần tử nhỏ nhất trong dãy còn lại

Page 11: 3giaithuatsxep t lan

min

1 2 3 4 5 6 7 8

i=5

11

3 5 9 7 15 10

Tìm phần tử nhỏ nhất trong dãy còn lại

1 2

Page 12: 3giaithuatsxep t lan

min

1 2 3 4 5 6 7 8

i=6

12

3 5 7 9 15 101 2

Tìm phần tử nhỏ nhất trong dãy còn lại

Page 13: 3giaithuatsxep t lan

min

1 2 3 4 5 6 7 8

i=7

13

3 5 7 9 15 101 2

Tìm phần tử nhỏ nhất trong dãy còn lại

Page 14: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=8

14

3 5 7 9 10 151 2

Kết thúc vì chỉ còn 1 phần tử

Tìm phần tử nhỏ nhất trong dãy còn lại

Page 15: 3giaithuatsxep t lan

c. Cài đặtc. Cài đặtProcedure SelectionSort;Var i, j, jmin: integer;Begin

for i := 1 to n-1 do begin jmin := i; for j := i+1 to n do if K[j] < K[jmin] then jmin := j; if jmin <> j then swap (K[jmin],K[i]); end;

End;

Page 16: 3giaithuatsxep t lan

d. Đánh giá thời gian thực hiệnd. Đánh giá thời gian thực hiện• Coi phép so sánh K[j] < K[jmin] là phép

toán tích cực• Ở lượt thứ i để chọn ra khóa min cần n-i

phép toán tích cực (không phụ thuộc tình trạng ban đầu của dãy)

• Tổng số phép so sánh phải thực hiện: (n-1)+(n-2)+…+1 = n*(n-1)/2• Thời gian thực hiện thuật toán là Θ(n2)

Page 17: 3giaithuatsxep t lan

22. . Sắp xếp kiểu chèn Sắp xếp kiểu chèn (Insertion Sort)(Insertion Sort)

a. Ý tưởng thuật toánb. Mô phỏngc. Cài đặtd. Đánh giá thời gian thực hiện

giải thuật

Page 18: 3giaithuatsxep t lan

a. Ý tưởng thuật toán kiểu chèna. Ý tưởng thuật toán kiểu chèn• Xét dãy khóa K[1..n] ta thấy dãy con chỉ gồm

1 khóa K1 có thể coi là đã sắp xếp.• Với 2 ≤ i ≤ n giả sử i-1 phần tử đầu của dãy đã

được sắp xếp: K1 ≤ K2 ≤ … ≤ Ki-1

Khi đó chèn phần tử Ki vào một vị trí hợp lí trong đoạn đầu gồm i-1 phần tử đã được sắp xếp

• Thực hiện quy trình này lần lượt với i từ 2→ n và cho 1 dãy khóa đã sắp xếp sau khi kết thúc

Page 19: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=2

19

7 3 9 2 15 1

Tìm vị trí chèn cho phần tử thứ 2

10 5

b. Mô phỏng thuật toán kiểu chènb. Mô phỏng thuật toán kiểu chèn

Page 20: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=3

20

7 3 9 2 15 1

Tìm vị trí chèn cho phần tử thứ 3

5 10

Page 21: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=4

21

10 3 9 2 15 1

Tìm vị trí chèn cho phần tử thứ 4

5 7

Page 22: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=5

22

7 10 9 2 15 1

Tìm vị trí chèn cho phần tử thứ 5

3 5

Page 23: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=6

23

7 9 10 2 15 1

Tìm vị trí chèn cho phần tử thứ 6

3 5

Page 24: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=7

24

5 7 9 10 15 1

Tìm vị trí chèn cho phần tử thứ 7

2 3

Page 25: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=8

25

5 7 9 10 15 1

Tìm vị trí chèn cho phần tử thứ 8

2 3

Page 26: 3giaithuatsxep t lan

1 2 3 4 5 6 7 8

i=9

26

3 5 7 9 10 151 2

Kết thúc

Page 27: 3giaithuatsxep t lan

Procedure InsertionSort;Var i, j: integer; temp: Tkey;Begin For i := 2 to n do Begin

temp := K[i]; j := i–1;while (j>0) and (temp<K[j]) do

begin K[j+1]:=K[i]; j:=j-1; end;K[j+1] := temp;

end;End;

c. Cài đặtc. Cài đặt

Page 28: 3giaithuatsxep t lan

d. Đánh giá thời gian thực hiệnd. Đánh giá thời gian thực hiện• Coi phép toán tích cực là phép kiểm tra

điều kiện: (j>0)and(temp<K[j])• Chi phí thời gian thực hiện phụ thuộc

vào tình trạng khóa ban đầu.

Trường hợp

Số lần thực hiện phép toán Thời gian thực hiện

Xấu nhất n-1 Θ(n)Tốt

nhất (n-1)(n+2)/2 Θ(n2)

Page 29: 3giaithuatsxep t lan

3. Sắp xếp kiểu nổi bọt 3. Sắp xếp kiểu nổi bọt (Buble Sort)(Buble Sort)

a. Ý tưởng thuật toánb. Mô phỏngc. Cài đặtd. Đánh giá thời gian thực hiện

giải thuật

Page 30: 3giaithuatsxep t lan

a. Ý tưởng thuật toán kiểu nổi bọta. Ý tưởng thuật toán kiểu nổi bọt• Dãy khóa K sẽ được duyệt từ cuối lên

đầu dãy nếu gặp khóa kế cận ngược thứ tự thì đổi chỗ chúng cho nhau.

• Sau lần duyệt như vậy khóa nhỏ nhất trong dãy khóa sẽ được chuyển về vị trí đầu tiên.

• Vấn đề được lặp lại với việc sắp xếp dãy khóa K[2..n]

Page 31: 3giaithuatsxep t lan

12345678

31

7

3

9

2

15

1

10

5

i

j

b. Mô phỏng thuật toán nổi bọtb. Mô phỏng thuật toán nổi bọt

Page 32: 3giaithuatsxep t lan

12345678

32

7

3

9

2

15

1

10

5

i

j

Page 33: 3giaithuatsxep t lan

12345678

33

7

3

9

2

15

1

10

5

i

j

Page 34: 3giaithuatsxep t lan

12345678

34

7

3

9

2

15

1

10

5

i

j

Page 35: 3giaithuatsxep t lan

12345678

35

7

3

9

2

15

1

10

5i

j

Page 36: 3giaithuatsxep t lan

12345678

36

7

3

9

2

15

1

10

5

i

j

Page 37: 3giaithuatsxep t lan

12345678

37

7

3

9

2

15

1

10

5

i

j

Page 38: 3giaithuatsxep t lan

12345678

38

7

3

9

2

15

1

10

5

i

Page 39: 3giaithuatsxep t lan

c. Cài đặtc. Cài đặtProcedure BubleSort;Var i, j: integer;Begin

For i := 2 to n dofor j := n downto i do

if K[j]<K[j-1] thenswap(K[j],K[j-1]);

End;

Page 40: 3giaithuatsxep t lan

d. Đánh giá thời gian thực hiệnd. Đánh giá thời gian thực hiện

• Coi phép toán tích cực là: K[j]<K[j-1]• Số lần thực hiện phép so sánh:

n(n-1)/2• Thời gian thực hiện thuật toán: Θ(n2)

Page 41: 3giaithuatsxep t lan

So sánh 3 giải thuậtSo sánh 3 giải thuật

Giải thuật Thời gian

SelectionSort Θ(n2)

InsertionSort Θ(n) Θ(n2)

BubleSort Θ(n2)

InsertSort tỏ ra “tốt hơn” so với hai phương pháp kia nhưng với n khá lớn thì chi phí thời gian thực hiện của cả 3 phương pháp đều là Θ(n2) và đây vẫn là chi phí cao