[r]
(1)Chương 4: Giải thuật sắp xếp tìm kiếm đơn giản
1 Sắp xếp chọn (Selection Sort)
2 Sắp xếp chèn (Insert Sort)
3 Sắp xếp nổi bọt (Bubble Sort)
4 Tìm kiếm tuần tự (Sequence Search)
Ngô Công Thắng Bài giảng CTDL> - Chương 04 6.1
1 Sắp xếp chọn (Selection Sort)
1.1 Phương pháp
• Giả sử cần sắp xếp tăng dần một dãy khoá a1, a2, , an.
• Ý tưởng của thuật tốn như sau:
– Chọn phần tử có khố nhỏ nhất – Đổi chỗ với phần tử a1
(2)1.1 Phương pháp (tiếp)
• Ví dụ:
Cho dãy khố ban đầu là: 6, 10, 1, 8, 9
với n=5.
i=1 1, 10, 6, 8, 9 i=2 1, 6, 10, 8, 9 i=3 1, 6, 8, 10, 9 i=4 1, 6, 8, 9, 10
Ngô Công Thắng Bài giảng CTDL> - Chương 04 6.3
1.1 Phương pháp (tiếp)
Procedure selectionSort(a,n); For i:= to n-1 Do
Begin
{Tìm phần tử nhỏ vị trí k } k:=i;
For j:=i+1 To n Do
If a[j] < a[k] then k:=j
{Đổi chỗ phần tử nhỏ k cho phần tử i} If k ≠ i then a[k]↔a[i];
(3)2.2 Đánh giá giải thuật
Ngô Công Thắng Bài giảng CTDL> - Chương 04
• Với giải thuật trình bày ở phép tốn tích cực
là phép so sánh (a[j]<a[k]).
• Gọi C số lượng phép so sánh, C được tính như sau:
Ở lượt thứ i (i=1, 2,… , n-1), để tìm khố nhỏ nhất cần n-i phép so sánh Số lượng phép so sánh không phụ thuộc vào tình trạng ban đầu của dãy khố Do đó ta có:
• Vậy, độ phức tạp tính toán O(n2)
6.5
2 Sắp xếp chèn (Insert Sort)
2.1 Phương pháp
• Phương pháp được những người chơi hay
dùng.
• Giả sử cần sắp xếp tăng dần dãy khoá a1, a2, , an Ý
tưởng thuật toán như sau:
– Các phần tử chia thành dãy đích: a1, , ai-1 (kết quả)
và dãy nguồn ai, , an
– Bắt đầu với i=2, bước phần tử thứ i dãy nguồn
(4)2.1 Phương pháp
• Ví dụ: Cho dãy khố 6, 10, 1, 7, với n=5 (dãy
số có phần tử).
Dãy đích Dãy nguồn
6 10, 1, 7, 4
i=2 6, 10 1, 7, 4
i=3 1, 6, 10 7, 4
i=4 1, 6, 7, 10 4
i=5 1, 4, 6, 7, 10
Ngô Công Thắng Bài giảng CTDL> - Chương 04 6.7
Thủ tục chèn
Procedure insertSort(a,n) 1) a[0]:=-∞
2) For i:=2 to n Do Begin
tg:=a[i]; j:=i-1; While tg<a[j] Do
Begin
a[j+1]:=a[j]; j:=j-1; End;
a[j+1]:=tg; {chèn tg vào sau a[j]} End;
(5)2.2 Đánh giá thuật tốn
• Phép tốn tích cực thuật tốn
phép so sánh (tg<a[j]) Số phép toán so sánh C
được tính như sau:
– Trường hợp thuận lợi nhất dãy khoá a1, a2, , an
đã được sắp, như vậy mỗi lần chỉ cần phép so sánh Do vậy
Ngô Công Thắng Bài giảng CTDL> - Chương 04 6.9
2.2 Đánh giá thuật tốn
• Trường hợp xấu dãy khoá theo thứ tự ngược với
thứ tự xếp lượt i cần có: C= (i-1) phép so sánh Do
• Trường hợp trung bình: Giả sử giá trị khố xuất
đồng khả trung bình phép so sánh lượt thứ i Ci= i/2, số phép so sánh trung bình giải thuật là:
(6)3 Sắp xếp nổi bọt (Bubble Sort)
3.1 Phương pháp
• Giả sử cần sắp xếp tăng dần dãy khoá a1, a2, , an Ý
tưởng thuật toán như sau:
– So sánh cặp khóa liền kề, gối từ phải qua trái, khóa đứng sau nhỏ khóa đứng trước đổi chỗ Loạt so sánh thứ khóa nhỏ dãy đẩy lên vị trí (gọi phần tử sắp)
– Tiếp tục so sánh đổi chỗ phần tử liền kề gối dãy chưa sắp, lần thứ ta số nhỏ dãy chưa đưa lên đầu dãy chưa sắp(ví trí 2)
– Cứ tiếp tục làm tương tự dãy phần tử
Ngô Công Thắng Bài giảng CTDL> - Chương 04 6.11
3.1 Phương pháp (tiếp)
• Ví dụ: Cho dãy khoá ban đầu là: 6, 3, 7, 10, 1, với n=6.
6, 3, 7, 10, 1, 8
(7)Thủ tục sắp xếp nổi bọt
Procedure bubbleSort(a,n) For i:= to n-1 Do
For j:= n downto i+1 Do If a[j]<a[j-1] then
a[j] <-> a[j-1]; Return
Ngô Công Thắng Bài giảng CTDL> - Chương 04 6.13
3.2 Đánh giá thuật tốn
• Giải thuật tương tự như giải thuật sắp xếp bằng
cách chọn trực tiếp (mục 1), đó có:
• Nhận xét: Với phương pháp sắp xếp trên, nếu n
vừa nhỏ phương pháp chèn trực tiếp (insert sort) tỏ tốt hơn, nếu với n lớn cả phương pháp đều có cấp O(n2), đây một chi phí thời gian