Chương 2.2. Giải thuật sắp xếp
ầ
Tr n Minh Thái Email: minhthai@huflit.edu.vn Website: www.minhthai.edu.vn
1
Mục tiêu
Nắm vững, minh họa và tính toá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ự
Một số CTDL đã định nghĩa trước trật tự của
hợp lý nào đó
các phần tử, khi đó mỗi phần tử khi thêm vào
Sắp xếp là quá trình xử lý một danh sách các
3
phải đảm bảo trật tự này
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ử
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
Ngoài ra, các giải thuật sắp xếp còn phải di
chặt chẽ với số lần so sánh các khóa
chuyển các phần tử
4
Chiếm nhiều thời gian khi các phần tử có
kích thước lớn
Các khái niệm
Khái niệm nghịch thế
a0 a1 a2
a3 … … an-
an- 2
An- 1
3
Giả sử xét mảng có thứ tự tăng dần, nếu có
i
Mục tiêu của sắp xếp là khử các nghịch thế
5
(bằng cách hoán vị)
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
7
trong dãy.
Đổi chỗ trực tiếp – interchange sort Giả sử cần sắp xếp dãy số sau tăng dần
15
10
9
7
5
0 1 2
3 3
4
2 5
6
1 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)
15
10
9
7
5
2
3 3
4
2 5
6
1 7
9
0 1
i j
Đổi chỗ trực tiếp – interchange sort Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
15
10
9
7
5
2
3 3
4
2 5
6
1 7
10
1 0
j i
Đổi chỗ trực tiếp – interchange sort Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
15
10
9
7
5
1 2 0 4
3 3
2 5
6
1 7
11
j i
Đổi chỗ trực tiếp – interchange sort Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
15
10
9
7
5
1 2
3 0
3 4
2 5
6
1 7
12
i j
Đổi chỗ trực tiếp – interchange sort Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
15
10
9
7
5
1 2 3
3 0
6
2 5
1 7
13
4
i j
Đổi chỗ trực tiếp – interchange sort Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
15
10
9
7
5
1 2 3 4
2 0
6
3 5
1 7
14
i j
Đổi chỗ trực tiếp – interchange sort Bước 1: Xét phần tử đầu tiên (tại vị trí 0)
15
10
9
7
5
1 2 3 4
3 5
2 0
6
1 7
15
i j
Đổ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 15
10
9
7
5
1 2 3 4
3 5
6
1 1 0
2 7
16
i j
Đổi chỗ trực tiếp – interchange sort Bước 2: Xét phần tử thứ hai (tại vị trí 1)
15
10
9
7
5
1 2
1 1 0
4 3
3 5
6
2 7
17
j i
Đổi chỗ trực tiếp – interchange sort Bước 2: Xét phần tử thứ hai (tại vị trí 1)
15
10
9
7
5
1 1 0
2 1 4 3
3 5
6
2 7
18
j i
Đổi chỗ trực tiếp – interchange sort Bước 2: Xét phần tử thứ hai (tại vị trí 1)
15
10
9
7
5
1 1 0
1 2 3 4
3 5
6
2 7
19
i j
Đổi chỗ trực tiếp – interchange sort Bước 2: Xét phần tử thứ hai (tại vị trí 1)
15
10
9
7
5
2 3
1 1 0
1 6
3 5
2 7
20
4
i j
Đổi chỗ trực tiếp – interchange sort Bước 2: Xét phần tử thứ hai (tại vị trí 1)
15
10
9
7
5
2 3 4
1 1 0
3 1
6
2 7
21
5
i j
Đổi chỗ trực tiếp – interchange sort Bước 2: Xét phần tử thứ hai (tại vị trí 1)
15
10
9
7
5
2 3 4 5
1 1 0
3 1
6
2 7
22
i j
Đổ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 15
10
9
7
5
2 3 4 5 6
1 1 0
2 2 1
3 7
23
i j
Đổi chỗ trực tiếp – interchange sort Bước 3: Xét phần tử thứ ba (tại vị trí 2)
15
10
9
7
5
2 3
1 1 0
2 2 1
4 5 6
3 7
24
j i
Đổi chỗ trực tiếp – interchange sort Bước 3: Xét phần tử thứ ba (tại vị trí 2)
15
10
9
7
5
1 1 0
2 2 1
3 2 4 5 6
3 7
25
j i
Đổi chỗ trực tiếp – interchange sort Bước 3: Xét phần tử thứ ba (tại vị trí 2)
15
10
9
7
5
1 1 0
2 2 1
3 4 2 6 5
3 7
26
j i
Đổi chỗ trực tiếp – interchange sort Bước 3: Xét phần tử thứ ba (tại vị trí 2)
15
10
9
7
5
1 1 0
2 2 1
3 4 2 6
3 7
27
5
i j
Đổi chỗ trực tiếp – interchange sort Bước 3: Xét phần tử thứ ba (tại vị trí 2)
15
10
9
7
5
1 1 0
2 2 1
3 4 5 2 6
3 7
28
i j
Đổi chỗ trực tiếp – interchange sort Bước 3: Xét phần tử thứ ba (tại vị trí 2)
Kết thúc bước 3 15
10
9
7
5
3 4 5 6 7
1 1 0
2 2 1
3 3 2
29
j i
Đổi chỗ trực tiếp – interchange sort Bước 4: Xét phần tử thứ tư (tại vị trí 3)
15
10
9
7
5
1 1 0
2 2 1
3 4
3 3 2
30
6 5 7
j i
Đổi chỗ trực tiếp – interchange sort Bước 4: Xét phần tử thứ tư (tại vị trí 3)
15
10
9
7
5
1 1 0
2 2 1
3 3 2
31
6 5 7 3 4
i j
Đổi chỗ trực tiếp – interchange sort Bước 4: Xét phần tử thứ tư (tại vị trí 3)
15
10
9
7
5
1 1 0
2 2 1
3 3 2
32
4 5 3 6 7
j i
Đổi chỗ trực tiếp – interchange sort Bước 4: Xét phần tử thứ tư (tại vị trí 3)
15
10
9
7
5
1 1 0
2 2 1
3 3 2
33
4 5 3 6 7
i j
Đổi chỗ trực tiếp – interchange sort Bước 4: Xét phần tử thứ tư (tại vị trí 3)
Kết thúc bước 4 15
10
9
7
5 5
1 1 0
2 2 1
3 3 2
34
4 5 6 3 7
i j
Đổi chỗ trực tiếp – interchange sort Bước 5: Xét phần tử thứ năm (tại vị trí 4)
15
10
9
7
5 5
1 1 0
2 2 1
3 3 2
35
4 5 3 6 7
j i
Đổi chỗ trực tiếp – interchange sort Bước 5: Xét phần tử thứ năm (tại vị trí 4)
15
10
9
7
5 5
1 1 0
2 2 1
3 3 2
36
3 7 6 4 5
i j
Đổi chỗ trực tiếp – interchange sort Bước 5: Xét phần tử thứ năm (tại vị trí 4)
15
10
9
7
5 5
1 1 0
2 2 1
3 3 2
37
3 5 6 4 7
j i
Đổi chỗ trực tiếp – interchange sort Bước 5: Xét phần tử thứ năm (tại vị trí 4)
Kết thúc bước 5 15
10
9
7 7
5 5
1 1 0
2 2 1
3 3 2
38
3 5 6 7 4
j i
Đổi chỗ trực tiếp – interchange sort Bước 6: Xét phần tử thứ sáu (tại vị trí 5)
15
10
9
7 7
5 5
1 1 0
2 2 1
3 3 2
39
3 5 6 4 7
j i
Đổi chỗ trực tiếp – interchange sort Bước 6: Xét phần tử thứ sáu (tại vị trí 5)
15
10
9
7 7
5 5
1 1 0
2 2 1
3 3 2
40
3 4 5 6 7
i j
Đổi chỗ trực tiếp – interchange sort Bước 6: Xét phần tử thứ sáu (tại vị trí 5)
Kết thúc bước 6 15
10
9 9
7 7
5 5
1 1 0
2 2 1
3 3 2
41
3 4 6 7 5
j i
Đổi chỗ trực tiếp – interchange sort Bước 7: Xét phần tử thứ bảy (tại vị trí 6)
15
10
9 9
7 7
5 5
1 1 0
2 2 1
3 3 2
42
3 4 6 7 5
j i
Đổi chỗ trực tiếp – interchange sort Bước 7: Xét phần tử thứ bảy (tại vị trí 6)
Kết thúc bước 7
15
10 10
9 9
7 7
5 5
1 1 0
2 2 1
3 3 2
43
3 4 5 6 7
i j
Đổi chỗ trực tiếp – interchange sort Hoàn tất sắp xếp
15
10 10
9 9
7 7
5 5
11 0
2 2 1
3 3 2
44
3 4 5 6 7
Giải thuật
Bước 1 : i = 0;// bắt đầu từ đầu dãy
Bước 2 : j = i+1;//tìm các phần tử a[j] < a[i], j>i
Bước 3 :
Trong khi j < n thực hiện

