Ý tưởng giải thuật Dựa vào việc so sánh và đổi chỗ nếu cần các phần tử kế tiếp trong dãy đối tượng cần sắp Ví dụ Cho dãy X có 5 số nguyên n=5 như sau Yêu cầu sắp xếp dãy số theo
Trang 1CH ƯƠ NG 3
CÁC THU T TOÁN S P X P Ậ Ắ Ế
Trang 2MỤC TIÊU
Phát biểu bài toán sắp xếp
Phương pháp đổi chỗ liên tiếp
Phương pháp lựa chọn
Phương pháp chèn
Trang 3Bình Hoàng
An Bình Hoàng Hùng Thắng
21 44 52 73 81
Trang 4KHÁI NIỆM SẮP XẾP (TT)
Khái niệm
Sắp xếp là việc biến đổi vị trí của một tập đối
tượng theo một trật tự mới nhằm thỏa mãn một mục đích.
Mục đích
Giúp việc tìm kiếm được thực hiện nhanh hơn
Sắp thứ tự để in bảng biểu
Trang 5Đầu ra: Dãy n đối tượng được sắp
xếp theo trật tự của khóa.
BÀI
TOÁN
Trang 7CÁC THUẬT TOÁN SẮP XẾP HAY GẶP
Ba thuật toán sắp xếp đơn giản
Sắp xếp nổi bọt ( Bubble Sort )
Sắp xếp lựa chọn ( Selection Sort )
Sắp xếp chèn ( Insertion Sort )
Thuật toán sắp xếp phân đoạn ( Quick Sort )
Thuật toán sắp xếp vun đống ( Heap Sort )
Thuật toán sắp xếp trộn ( Merge Sort )
Trang 8 Ý tưởng giải thuật
Dựa vào việc so sánh và đổi chỗ (nếu cần) các phần tử kế tiếp trong dãy đối tượng cần sắp
Ví dụ
Cho dãy X có 5 số nguyên (n=5) như sau
Yêu cầu sắp xếp dãy số theo chiều tăng dần
THUẬT TOÁN SẮP XẾP NỔI BỌT
Trang 9THUẬT TOÁN SẮP XẾP NỔI BỌT
Cách làm : duyệt và so sánh các cặp phần tử kế tiếp của dãy, giả sử là Xj và Xj+1, nếu trái thứ tự thì đổi chỗ
Trang 11 Đến đây ta được hai phần tử đứng đúng vị trí, các phần tử còn lại thì không.
Vậy phải làm mấy lần nữa?
Hai lần nữa, ta được dãy sắp theo chiều tăng dần
Ôi chà… dễ ợt…!
THUẬT TOÁN SẮP XẾP NỔI BỌT
Trang 12 Ví dụ 2:
Cho dãy số sau
Yêu cầu: Minh họa quá trình sắp xếp dãy theo chiều giảm dần dựa vào ý tưởng trên.
THUẬT TOÁN SẮP XẾP NỔI BỌT
Trang 13 Giải thuật
THUẬT TOÁN SẮP XẾP NỔI BỌT
void sort(int X[], int n) {
for (int i=1; i<=n-1; i++) for (int j=0; j<n-i; j++)
if (X[j]>X[j+1]) {
int tg = X[j]; X[j] = X[j+1]; X[j+1] = tg; }
Trang 14 Ứng dụng
Viết chương trình thực hiện các việc sau
Nhập vào một dãy n số nguyên (0<n<100, n nhập
Trang 15 Bài tập: Viết chương trình thực hiện các việc sau
Nhập vào một danh sách học sinh (0<n<100, n nhập
từ bàn phím), mỗi học sinh gồm các thông tin: Mã học sinh, họ và tên, năm sinh và điểm trung bình.
Sắp xếp danh sách theo chiều tăng dần của tên học sinh bằng thuật toán nổi bọt
In danh sách vừa sắp ra màn hình
Sắp xếp danh sách theo chiều giảm dần của điểm trung bình
In danh sách ra màn hình
Yêu cầu: Mỗi công việc được viết bằng một thủ tục
THUẬT TOÁN SẮP XẾP NỔI BỌT
Trang 16 Ý tưởng giải thuật
Dựa vào thuật toán MAX
Duyệt và tìm phần tử nhỏ nhất của dãy và đổi chỗ phần tử đó cho phần tử đầu dãy.
Cho dãy X có 5 số nguyên (n=5) như sau
Yêu cầu sắp xếp dãy số theo chiều tăng dần
THUẬT TOÁN SẮP XẾP LỰA CHỌN
Trang 17 Cách làm : Chọn phần tử có giá trị nhỏ nhất, giả sử
là Xm, đổi chỗ cho phần tử đầu dãy là Xi
THUẬT TOÁN SẮP XẾP LỰA CHỌN
Trang 18THUẬT TOÁN SẮP XẾP LỰA CHỌN
Trang 19 Ví dụ 2
Cho dãy số nguyên như sau
Yêu cầu: Dựa vào ý tưởng trên, minh họa việc sắp xếp dãy số theo chiều giảm dần
THUẬT TOÁN SẮP XẾP LỰA CHỌN
Trang 20 Giải thuật
THUẬT TOÁN SẮP XẾP LỰA CHỌN
void sort(int X[ ], int n) {
for (int i=0; i< n-1; i++) {
Trang 21 Ứng dụng
Viết chương trình thực hiện các việc sau
Nhập vào một dãy n số nguyên (0<n<100, n nhập
Trang 22 Bài toán gợi ý tưởng:
Trang 23 Ví dụ
Cho dãy X có 5 số nguyên (n=5) như sau
Yêu cầu sắp xếp dãy số theo chiều tăng dần
THUẬT TOÁN SẮP XẾP CHÈN
Trang 24 Bài toán thể hiện ý tưởng:
Cho dãy được sắp tăng dần
Trang 25 Đưa ý tưởng vào bài toán sắp xếp:
Xem dãy cần sắp gồm 2 dãy nối tiếp
Dãy trái (dãy đích) gồm các phần tử được sắp, dãy phải (dãy nguồn) là các phần tử chưa được sắp.
Trang 26 Đưa ý tưởng vào bài toán
Lấy phần tử đầu dãy nguồn chèn vào vị trí thích hợp trong dãy đích
Trang 29 Ví dụ 2
Cho dãy số nguyên như sau
Yêu cầu: Dựa vào ý tưởng trên, minh họa việc sắp xếp dãy số theo chiều giảm dần
THUẬT TOÁN SẮP XẾP CHÈN
Trang 30 Thực hiện n-1 lần “chia”
dãy thành dãy đích và dãy
nguồn
Mỗi lần chia lấy phần tử
đầu của dãy nguồn (giả sử là
Xi (I=1->N-1)), chèn vào vị trí
thích hợp trong dãy đích
Trang 31 Ứng dụng
Viết chương trình thực hiện các việc sau
Nhập vào một dãy n số nguyên (0<n<100, n nhập
Trang 32 Ý tưởng
Chia để trị:
Chia bài toán thành các bài toán con
Giải quyết các bài toán con
Kỹ thuật đệ quy
Bài toán lớn được giải quyết nhờ việc giải quyết bài toán nhỏ cùng dạng nhưng có kích thước nhỏ hơn
SẮP XẾP PHÂN ĐOẠN - QUICK SORT
Trang 33 Ví dụ
Sắp dãy số nguyên
Bài toán lớn được chia thành ba bài toán con
Trị ba bài toán con theo cách trên
Tổng hợp lời giải ta sẽ có dãy được sắp
QUICK SORT
53 -21 33 68 40 82 31 67 25
Trang 34 Thuật toán cơ sở
QUICK SORT
Quick_sort(S) Begin
If (||S||<=1) then return Else begin
- Chọn phần tử chia t ∈ S;
- Chia S thành ba dãy con
S1 = {e ∈ S | e<t} S2 = {e ∈ S | e=t} S3 = {e ∈ S | e>t}
- Quick_sort(S1);
- Quick_sort(S3);
end;
END;
Trang 35 Minh họa thuật toán trên dãy n=9 số nguyên
Trang 3625 21 31 33 40 82 67 68 53
Trang 37 Làm tương tự với các đoạn S1, và S3 cho đến khi mỗi đoạn chia chỉ còn một phần tử ta có dãy S được sắp
Thiết kế thuật toán:
Mỗi lần chia ta dùng hai biến chỉ số i và j.
i chạy từ trái sang, gặp phần tử không nhỏ hơn phần
tử chia t, i dừng lại
j chạy từ phải sang, gặp phần tử không lớn hơn phần
tử chia t, j dừng lại
nếu i < j đổi chỗ Xi và Xj, i=i+1, j=j-1
Lặp lại quá trình cho đến khi i>j.
QUICK SORT
Trang 39 Ứng dụng
Viết chương trình thực hiện các việc sau
Nhập vào một dãy n số nguyên (0<n<100, n nhập