3giaithuatsxep t lan
TRANSCRIPT
CÁC GIẢI THUẬT CÁC GIẢI THUẬT SẮP XẾPSẮP XẾP
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)
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
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)
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
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]
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
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
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
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
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
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
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
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
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;
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)
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
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
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
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
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
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
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
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
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
1 2 3 4 5 6 7 8
i=9
26
3 5 7 9 10 151 2
Kết thúc
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
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)
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
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]
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
12345678
32
7
3
9
2
15
1
10
5
i
j
12345678
33
7
3
9
2
15
1
10
5
i
j
12345678
34
7
3
9
2
15
1
10
5
i
j
12345678
35
7
3
9
2
15
1
10
5i
j
12345678
36
7
3
9
2
15
1
10
5
i
j
12345678
37
7
3
9
2
15
1
10
5
i
j
12345678
38
7
3
9
2
15
1
10
5
i
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;
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)
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