Tải bản đầy đủ (.ppt) (39 trang)

các thuật toán sắp xếp cơ bản pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.29 MB, 39 trang )

CH NG 3ƯƠ
CÁC THU T TOÁN S P X PẬ Ắ Ế
MỤC TIÊU

Khái niệm sắp xếp

Phát biểu bài toán sắp xếp

Sắp xếp trong và sắp xếp ngoài

Các phương pháp sắp xếp đơn giản

Phương pháp đổi chỗ liên tiếp

Phương pháp lựa chọn

Phương pháp chèn

Phương pháp phân đoạn – Quick Sort

Phương pháp vun đống – Heap Sort

Phương pháp sắp xếp trộn
KHÁI NIỆM SẮP XẾP

Đặt vấn đề

Cho dãy số

Cho danh sách tên học sinh


81 52 73 21 44
81 73 52 44 21
Hùng
Thắng
An
Bình
Hoàng
An
Bình
Hoàng
Hùng
Thắng
21 44 52 73 81
KHÁ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
BÀI TOÁN SẮP XẾP

Ví dụ: Bài toán sắp xếp dãy số tăng dần


Đầu vào: 7 3 8 1 5

Đầu ra: 1 3 5 7 8
Đầu vào: Dãy n đối tượng, mỗi đối
tượng có một khóa sắp xếp

Đầ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
SẮP XẾP TRONG VÀ SẮP XẾP NGOÀI

Sắp xếp trong:

Dãy đối tượng được sắp có mặt đầy đủ ở bộ
nhớ trong (RAM).

Sắp xếp một mảng số, hoặc một danh sách
tuyến tính – Sắp tại chỗ

Sắp xếp ngoài:

Dãy đối tượng được sắp chưa có mặt đầy ở bộ
nhớ trong

Sắp xếp dữ liệu được lưu trong tệp.
CÁ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)

Ý 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
X0 X1 X2 X3 X4
5 -1 7 3 -4
THUẬ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ỗ
X0 X1 X2 X3 X4

5 -1 7 3 -4
-1 5 7 3 -4
-1 5 7 3 -4
-1 5 3 7 -4
-1 5 3 -4 7

Nhận xét

Sau lần duyệt vừa rồi ta thấy phần tử lớn nhất được
chuyển về cuối dãy, nghĩa là nó đứng đúng vị trí

Các phần tử còn lại vẫn chưa đúng thứ tự

Làm thế nào đây?
THUẬT TOÁN SẮP XẾP NỔI BỌT
X0 X1 X2 X3 X4
-1 5 3 -4 7
-1 5 3 -4 7
-1 3 5 -4 7
-1 3 -4 5 7

Đế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

X0 X1 X2 X3 X4
-4 -1 3 5 7

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
X0 X1 X2 X3 X4 X5
-35 41 23 15 -62 71

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;
}
}

Thực hiện n-1 lần duyệt
dãy (từ trái sang phải)


Mỗi lần duyệt so sánh các
cặp phần tử kế tiếp nếu trái
chiều thì đổi chỗ

Ứ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
từ bàn phím)

In dãy vừa nhập ra màn hình

Sắp xếp dãy theo chiều tăng dần bằng thuật toán
nổi bọt

In dãy vừa sắp 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

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

Ý 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.

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 LỰA CHỌN
X0 X1 X2 X3 X4
3 -1 7 5 -4

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

3 -1 5 7 -4
-4 -1 5 7 3
-4 -1 5 7 3
-4 -1 5 7 3
Làm
mấy
lần?
THUẬT TOÁN SẮP XẾP LỰA CHỌN
-4 -1 5 7 3
-4 -1 3 7 5
-4 -1 3 7 5
-4 -1 3 5 7

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
X0 X1 X2 X3 X4 X5
53 -21 67 15 82 -14

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++)
{
int m=i;

for (int j=i+1; j<n; j++)
if (X[j]<X[m])
m=j;
int tg=X[m];
X[m]=X[i];
X[i]=tg;
}

Thực hiện n-1 lần duyệt
dãy (từ trái sang phải)

Mỗi lần duyệt tìm phần tử
nhỏ nhất, giả sử là Xm, đổi
chỗ cho phần tử đầu dãy là Xi
(i=0->n-2)

Ứ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
từ bàn phím)

In dãy vừa nhập ra màn hình

Sắp xếp dãy theo chiều tăng dần bằng thuật toán
LỰA CHỌN

In dãy vừa sắp 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 LỰA CHỌN

Bài toán gợi ý tưởng:
THUẬT TOÁN SẮP XẾP CHÈN
3
4
7
9
3
4
6
7
9
3
4
6
7
9

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
X0 X1 X2 X3 X4
3 -1 7 -4 5


Bài toán thể hiện ý tưởng:

Cho dãy được sắp tăng dần

Chèn số 1 vào dãy
THUẬT TOÁN SẮP XẾP CHÈN
-5 -1 2 4
-5 -1 2 4
1
-5 -1 1 2 4

Đư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.
THUẬT TOÁN SẮP XẾP CHÈN
X0 X1 X2 X3 X4
3 -1 7 -4 5
Dãy đích Dãy nguồn

×