2. SẮP XẾPSẮP XẾP
I. Bài toán sắp xếp
II. 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)
3. 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
4. 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)
5. 1. Sắp xếp kiểu chọn1. Sắp xếp kiểu chọn
(Selection Sort)(Selection Sort)
a. Ý tưởng thuật toán
b. Mô phỏng
c. Cài đặt
d. Đánh giá thời gian thực hiện
giải thuật
6. 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]
7. 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
8. 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
9. 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
10. 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
11. 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
12. 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
13. 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
14. 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
15. c. Cài đặtc. Cài đặt
Procedure 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;
16. 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
)
17. 22.. Sắp xếp kiểu chènSắp xếp kiểu chèn
(Insertion Sort)(Insertion Sort)
a. Ý tưởng thuật toán
b. Mô phỏng
c. Cài đặt
d. Đánh giá thời gian thực hiện
giải thuật
18. 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
19. 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
20. 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
21. 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
22. 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
23. 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
24. 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
25. 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
27. 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
28. 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
)
29. 3. Sắp xếp kiểu nổi bọt3. Sắp xếp kiểu nổi bọt
(Buble Sort)(Buble Sort)
a. Ý tưởng thuật toán
b. Mô phỏng
c. Cài đặt
d. Đánh giá thời gian thực hiện
giải thuật
30. 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]
39. c. Cài đặtc. Cài đặt
Procedure BubleSort;
Var i, j: integer;
Begin
For i := 2 to n do
for j := n downto i do
if K[j]<K[j-1] then
swap(K[j],K[j-1]);
End;
40. 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
)
41. 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