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

Please purchase a personal license - CÁC THUẬT TOÁN SẮP XẾP CƠ BẢN

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 (273.71 KB, 39 trang )

Please purchase a personal license.


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ố

21 44 52 73 81

81 52 73 21 44
81 73 52 44 21

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

An


Thắng

Bình

An

Hoàng

Bình

Hùng

Hoàng

Thắng


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


BÀI
TOÁN

Đầ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.

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


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)


THUẬT TOÁN SẮP XẾP NỔI BỌT

Ý 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

X0
5

X1
-1

X2
7

X3
3

X4
-4

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

5

X1
-1

X2
7

X3
3

X4
-4

-1

5

7

3

-4

-1

5

7


3

-4

-1

5

3

7

-4

-1

5

3

-4

7


THUẬT TOÁN SẮP XẾP NỔI BỌT
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?

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


THUẬT TOÁN SẮP XẾP NỔI BỌT
Đế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

X0

-4

X1
-1

Ôi chà… dễ ợt…!

X2
3

X3
5

X4
7


THUẬT TOÁN SẮP XẾP NỔI BỌT
Ví dụ 2:
Cho dãy số sau

X0
-35

X1
41

X2
23


X3
15

X4
-62

X5
71

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
Giải thuật

void sort(int X[], int n)
{
for (int i=1; i<=n-1; i++)

Thực hiện n-1 lần duyệt

for (int j=0; jif (X[j]>X[j+1])

dãy (từ trái sang phải)

{

Mỗi lần duyệt so sánh các


int tg = X[j];

cặp phần tử kế tiếp nếu trái

X[j] = X[j+1];

chiều thì đổi chỗ

X[j+1] = tg;
}
}


THUẬT TOÁN SẮP XẾP NỔI BỌT
Ứ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 (0từ 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 (0nhậ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 LỰA CHỌN
Ý 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

X0
3

X1
-1


X2
7

X3
5

X4
-4

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

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


THUẬT TOÁN SẮP XẾP LỰA CHỌN
Ví dụ 2
Cho dãy số nguyên như sau

X0
53

X1
-21

X2
67

X3
15


X4
82

X5
-14

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
Giải thuật

void sort(int X[ ], int n)
{
for (int i=0; i
Thực hiện n-1 lần duyệt

{
int m=i;

dãy (từ trái sang phải)

for (int j=i+1; j
Mỗi lần duyệt tìm phần tử

if (X[j]

nhỏ nhất, giả sử là Xm, đổi

m=j;

chỗ cho phần tử đầu dãy là Xi

int tg=X[m];

(i=0->n-2)

X[m]=X[i];
X[i]=tg;
}


THUẬT TOÁN SẮP XẾP LỰA CHỌN
Ứ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 (0từ 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 CHÈN
Bài toán gợi ý tưởng:


THUẬT TOÁN SẮP XẾP CHÈN
Ví dụ
Cho dãy X có 5 số nguyên (n=5) như sau

X0
3

X1
-1

X2
7

X3
-4

X4
5

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
Bài toán thể hiện ý tưởng:
Cho dãy được sắp tăng dần


-5
Chèn số

-5

-1

1

2

4

vào dãy

-1

2

4

2

4

1
-5

-1


1


THUẬT TOÁN SẮP XẾP CHÈN
Đư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.

X0
3
Dãy đích

X1
-1

X2
7

X3
-4

Dãy nguồn

X4
5



×