Chương 2.2. Giải thuật
sắp xếp
Trần Minh Thái
Email:
Website: www.minhthai.edu.vn
1
Mục tiêu
Nắm vững, minh họa và tính tốn được các
phép gán (hoán vị) các giải thuật sắp xếp cơ
bản trên mảng một chiều
Cài đặt được các giải thuật bằng ngôn ngữ C
2
Các khái niệm
Để truy xuất thơng tin nhanh chóng và chính xác thơng
tin phải được sắp xếp theo một trật tự hợp lý nào đó
Một số CTDL đã định nghĩa trước trật tự của các phần tử,
khi đó mỗi phần tử khi thêm vào phải đảm bảo trật tự này
Sắp xếp là quá trình xử lý một danh sách các phần tử
(hoặc các mẫu tin) để đặt chúng theo một thứ tự thỏa
mãn một tiêu chuẩn nào đó dựa trên nội dung thơng tin
lưu giữ tại mỗi phần tử
3
Khái niệm
Tương tự như các giải thuật tìm kiếm, khối lượng
cơng việc phải thực hiện có liên quan chặt chẽ với
số lần so sánh các khóa
Ngồi ra, các giải thuật sắp xếp còn phải di chuyển
các phần tử
Chiếm nhiều thời gian khi các phần tử có kích
thước lớn
4
Các khái niệm
Khái niệm nghịch thế
a0
a1
a2
a3
…
…
an-3 an-2 An-1
Giả sử xét mảng có thứ tự tăng dần, nếu có i
ai>aj thì ta gọi đó là nghịch thế.
Mục tiêu của sắp xếp là khử các nghịch thế (bằng
cách hoán vị)
5
Các giải thuật sắp xếp cơ bản
Đổi chỗ trực tiếp – Interchange Sort
Chọn trực tiếp – Selection Sort
Chèn trực tiếp – Insertion Sort
Nổi bọt – Bubble Sort
Quick Sort
Một số giải thuật khác đọc thêm trong tài liệu
6
Đổi chỗ trực tiếp – interchange sort
Ý tưởng
Xuất phát từ đầu dãy, tìm tất cả nghịch thế
chứa phần tử này, triệt tiêu chúng bằng cách
đổi chỗ (hoán vị)
Lặp lại xử lý trên với các phần tử tiếp theo
trong dãy.
7
Đổi chỗ trực tiếp – interchange sort
Giả sử cần sắp xếp dãy số sau tăng dần
10
10
0
55
77
1
2
33
3
99
4
15
15
22
5
6
11
7
8
Đổi chỗ trực tiếp – interchange sort
Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
10
10
55
77
0
1
2
i
j
33
3
99
4
15
15
22
5
6
11
7
9
Đổi chỗ trực tiếp – interchange sort
Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
10
10 7
55
7
0
1
i
j
2
33
3
99
4
15
15
22
5
6
11
7
10
Đổi chỗ trực tiếp – interchange sort
Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
10
10 7
55
7
0
i
1
2
j
33
3
99
4
15
15
22
5
6
11
7
11
Đổi chỗ trực tiếp – interchange sort
Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
33
0
i
10
10 7
7
1
2
55
3
j
99
4
15
15
22
5
6
11
7
12
Đổi chỗ trực tiếp – interchange sort
Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
33
0
i
10
10 7
7
1
2
55
3
99
4
j
15
15
22
5
6
11
7
13
Đổi chỗ trực tiếp – interchange sort
Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
22
0
i
10
10 7
7
1
2
55
3
99
4
15
15
33
5
j
6
11
7
14
Đổi chỗ trực tiếp – interchange sort
Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
22
0
i
10
10 7
7
1
2
55
3
99
4
15
15
33
5
6
j
11
7
15
Đổi chỗ trực tiếp – interchange sort
Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
Kết thúc bước 1
11
0
i
10
10 7
7
1
2
55
3
99
4
15
15
33
5
6
22
7
j
16
Đổi chỗ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 1)
11
0
i
10
10 7
7
1
2
j
55
3
99
4
15
15
33
5
6
22
7
17
Đổi chỗ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 1)
11
0
77
10
10
1
2
i
j
55
3
99
4
15
15
33
5
6
22
7
18
Đổi chỗ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 1)
11
0
10
10 7
55
7
99
1
4
i
2
3
j
15
15
33
5
6
22
7
19
Đổi chỗ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 1)
11
0
10
10 7
55
7
99
1
4
i
2
3
j
15
15
33
5
6
22
7
20
Đổi chỗ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 1)
11
0
33
1
i
10
10 7
7
2
3
99
4
15
15
55
5
j
6
22
7
21
Đổi chỗ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 1)
11
0
33
1
i
10
10 7
7
2
3
99
4
15
15
55
5
6
j
22
7
22
Đổi chỗ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 1)
Kết thúc bước 2
11
0
22
1
i
10
10 7
7
2
3
99
4
15
15
55
5
6
33
7
j
23
Đổi chỗ trực tiếp – interchange sort
Bước 3: Xét phần tử thứ ba (tại vị trí 2)
11
0
22
1
i
10
10 7
7
2
3
j
99
4
15
15
55
5
6
33
7
24
Đổi chỗ trực tiếp – interchange sort
Bước 3: Xét phần tử thứ ba (tại vị trí 2)
11
0
22
1
15
15
10
77 10 99
55
2
3
5
i
j
4
6
33
7
25