Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắ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ử được 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, ở mỗi bước phần tử thứ i của dãy nguồn được lấy ra và chèn vào vị trí thích hợp trong dãy đích sao cho dãy đích vẫn tăng dần. Sau đó i tăng lên 1 và lặp lại.

Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng trang 1

Trang 1

Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng trang 2

Trang 2

Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng trang 3

Trang 3

Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng trang 4

Trang 4

Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng trang 5

Trang 5

Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng trang 6

Trang 6

Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng trang 7

Trang 7

Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng trang 8

Trang 8

Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng trang 9

Trang 9

pdf 9 trang Danh Thịnh 10/01/2024 5000
Bạn đang xem tài liệu "Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng

Bài giảng Công nghệ phần mềm - Chương 6: Giải thuật sắp xếp - Ngô Công Thắng
CHƯƠNG 6
GIẢI THUẬT SẮP XẾP
GV. Ngô Công Thắng
Bộ môn Công nghệ phần mềm
Khoa Công nghệ thông tin
Website: dse.vnua.edu.vn/ncthang
Email: ncthang@vnua.edu.vn
Chương 6: Giải thuật sắp xếp
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. Sắp xếp nhanh (Quick Sort)
5. Sắp xếp vun đống (Heap Sort)
6. Sắp xếp hòa nhập (Merge Sort)
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.2
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 toán như sau:
– Chọn phần tử có khoá nhỏ nhất .
– Đổi chỗ nó với phần tử a1. 
– Sau đó lặp lại thao tác trên với n-1 phần tử 
còn lại, rồi lại lặp lại như trên với n-2 phần tử 
còn lại,..., cho tới khi chỉ còn 1 phần tử.
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.3
1.1. Phương pháp (tiếp)
• Ví dụ:
Cho dãy khoá 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 06 6.4
1.1. Phương pháp (tiếp)
Procedure Selection_sort(a,n);
For i:= 1 to n-1 Do 
Begin 
{Tìm phần tử nhỏ nhất ở 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ỏ nhất k cho phần tử i}
If k ≠ i then a[k]«a[i];
End
Return
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.5
2.2. Đánh giá giải thuật
Ngô Công Thắng Bài giàng CTDL> - Chương 06
• Với giải thuật trình bày ở trên thì phép toán tích cực 
là phép so sánh (a[j]<a[k]).
• Gọi C là 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 khoá nhỏ nhất 
cần n-i phép so sánh. Số lượng phép so sánh này 
không phụ thuộc vào tình trạng ban đầu của dãy 
khoá. Do đó ta có:
• Vậy, độ phức tạp tính toán là O(n2)
6.6
2. Sắp xếp chèn (Insert Sort)
2.1. Phương pháp
• Phương pháp này được những người chơi bà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ử được 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, ở mỗi bước phần tử thứ i của dãy nguồn 
được lấy ra và chèn vào vị trí thích hợp trong dãy đích sao 
cho dãy đích vẫn tăng dần. Sau đó i tăng lên 1 và lặp lại.
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.7
2.1. Phương pháp
• Ví dụ: Cho dãy khoá 6, 10, 1, 7, 4 với n=5 (dãy 
số có 5 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 06 6.8
Thủ tục chèn
Procedure Insert_sort(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; {đưa tg vào đúng vi trí}
End;
Return
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.9
2.2. Đánh giá thuật toán
• Phép toán tích cực trong thuật toán này là 
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 là dãy khoá a1, a2,..., an
đã được sắp, như vậy mỗi lần chỉ cần 1 phép so 
sánh. Do vậy
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.10
2.2. Đánh giá thuật toán
• Trường hợp xấu nhất nếu dãy khoá sắp theo thứ tự ngược với 
thứ tự sắp xếp thì ở lượt i cần có: C= (i-1) phép so sánh. Do 
vậy
• Trường hợp trung bình: Giả sử mọi giá trị khoá đều xuất hiện 
đồng khả năng thì trung bình phép so sánh ở lượt thứ i là Ci = 
i/2, do đó số phép so sánh trung bình của giải thuật này là:
• O(n2)
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.11
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:
– Đổi chỗ các phần tử liền kề nhau theo thứ tự tăng 
dần, lần thứ nhất số nhỏ nhất của dãy được đẩy lên vị 
trí đầu tiên (gọi là phần tử được sắp).
– Tiếp tục đổi chỗ các phần tử liền kề của dãy chưa 
sắp, lần thứ 2 ta được số nhỏ nhất của dãy chưa sắp 
được đưa lên đầu dãy chưa sắp.
– Cứ tiếp tục làm tương tự như trên cho đến khi dãy chỉ 
còn 1 phần tử.
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.12
3.1. Phương pháp (tiếp)
• Ví dụ: Cho dãy khoá ban đầu là: 6, 3, 7, 
10, 1, 8 với n=6.
6, 3, 7, 10, 1, 8
i=1 1, 6, 3, 7, 10, 8 
i=2 1, 3, 6, 7, 8, 10 
i=3 1, 3, 6, 7, 8, 10 
i=4 1, 3, 6, 7, 8, 10 
i=5 1, 3, 6, 7, 8, 10 
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.13
Thủ tục sắp xếp nổi bọt
Procedure Bubble_sort(a,n)
For i:= 1 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 06 6.14
3.2. Đánh giá thuật toán
• Giải thuật này 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), do đó có:
• Nhận xét: Với 3 phương pháp sắp xếp trên, nếu n 
vừa và nhỏ thì phương pháp chèn trực tiếp (insert 
sort) tỏ ra tốt hơn, nếu với n lớn thì cả 3 phương 
pháp đều có cấp O(n2), đây là một chi phí thời gian 
khá cao.
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.15
4. Sắp xếp nhanh (Quick Sort)
4.1. Phương pháp
• Sắp xếp nhanh (quick sort) còn được sắp xếp phân 
đoạn (partition sort).
• Ý tưởng thuật toán:
– Chọn ngẫu nhiên một phần tử x.
– Duyệt từ bên trái mảng cho tới khi có một phần tử 
ai>=x
– Sau đó duyệt từ bên phải mảng cho tới khi có một 
phần tử aj=<x
– Đổi chỗ ai và aj
– Tiếp tục duyệt và đổi chỗ cho tới khi 2 phía gặp nhau.
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.16
4.1. Phương pháp (tiếp)
• Kết quả mảng được chia thành 2 phần: 
bên trái là các phần tử < x, bên phải là các 
phần tử > x.
Ngô Công Thắng Bài giàng CTDL> - Chương 06 6.17
Thủ tục sắp xếp nhanh
Procedure Q_sort(L,R);
1) If L>=R then return;
2) i:=L; j:=R ; k:=(L+R) div 2;
3) x:=a[k];
4) Repeat
While a[i] <x Do i:=i+1;
While a[j] >x Do j:=j-1;
If i<j then a[i] « a[j]
Until i=j
5) Call Q_sort(L,j-1); { Thực hiện trên nửa <x }
6) Call Q_sort(j+1,R); { Thực hiện trên nửa >x }
Return
Ngô Công Thắng Bài giàng CTD

File đính kèm:

  • pdfbai_giang_cong_nghe_phan_mem_chuong_6_giai_thuat_sap_xep_ngo.pdf