CHƯƠNG 2.(TT)
GIẢI THUẬT SẮP XẾP
Võ Quang Hoàng Khang Email: vqhkhang@gmail.com
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/C++
2
Khái niệm
Sắp xếp là quá trình xử lý một danh sách các phần tử để đặt chúng theo một thứ tự thỏa mãn một tiêu chí 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 nghịch thế
a2
a3
a4 …
aN-2 aN-1 aN
…
a1
Giả sử xét mảng có thứ tự tăng dần, nếu có iaj 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ị)
3
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
4
Đổi chổ trực tiếp – interchange sort
Ý tưởng
Ý tưởng chính của giải thuật là 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ỗ phần tử này với
phần tử tương ứng trong cặp nghịch thế. Lặp lại
xử lý trên với các phần tử tiếp theo trong dãy.
5
Đổ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
3
1 2 3 4 5
2 6
7
1 8
6
Đổi chổ trực tiếp – interchange sort
Bước 1: Xét phần tử đầu tiên (tại vị trí 1)
15
10
9
7
5
3
3 4 5
2 6
7
1 8
1 2
7
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í 1)
15
10
9
7
5
3
3 4 5
2 6
7
1 8
2 1
8
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í 1)
15
10
9
7
5
3
2 3 1 5 4
2 6
7
1 8
9
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í 1)
15
10
9
7
5
3
2 3 1 4 5
2 6
7
1 8
10
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í 1)
15
10
9
7
5
3
2 3 4 7
2 6
1 8
5 1
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í 1)
15
10
9
7
5
3
2 3 4 5
2 1
7
1 8
6
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í 1)
15
10
9
7
5
3
2 3 4 5 6
2 1
7
1 8
13
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í 1)
Kết thúc bước 1 15
10
9
7
5
3
2 3 4 5 6 7
1 1 1
2 8
14
i j
Đổi chổ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 2)
15
10
9
7
5
3
2 3
1 1 1
5 4 6 7
2 8
15
j i
Đổi chổ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 2)
15
10
9
7
5
3
1 1 1
3 2 5 4 6 7
2 8
16
j i
Đổi chổ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 2)
15
10
9
7
5
3
1 1 1
2 3 4 5 6 7
2 8
17
i j
Đổi chổ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 2)
15
10
9
7
5
3
1 1 1
2 3 4 5 7 6
2 8
18
i j
Đổi chổ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 2)
15
10
9
7
5
3
3 4 5
1 1 1
2 7
2 8
6
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í 2)
15
10
9
7
5
3
3 4 5 6
1 1 1
2 7
2 8
20
i j
Đổi chổ trực tiếp – interchange sort
Bước 2: Xét phần tử thứ hai (tại vị trí 2)
Kết thúc bước 2 15
10
9
7
5
3
3 4 5 6 7
1 1 1
2 2 2
8
21
i j
Đổi chổ trực tiếp – interchange sort
Bước 3: Xét phần tử thứ ba (tại vị trí 3)
15
10
9
7
5
3
3 4
1 1 1
2 2 2
5 6 7 8
22
j i
Đổi chổ trực tiếp – interchange sort
Bước 3: Xét phần tử thứ ba (tại vị trí 3)
15
10
9
7
5
3
1 1 1
2 2 2
4 3 5 6 7 8
23
j i
Đổi chổ trực tiếp – interchange sort
Bước 3: Xét phần tử thứ ba (tại vị trí 3)
15
10
9
7
5
3
1 1 1
2 2 2
4 5 3 7 6 8
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í 3)
15
10
9
7
5
3
4 5
1 1 1
2 2 2
3 7 8 6
25
i j
Đổi chổ trực tiếp – interchange sort
Bước 3: Xét phần tử thứ ba (tại vị trí 3)
15
10
9
7
5
3
1 1 1
2 2 2
3 4 5 6 7 8
26
i j
Đổi chổ trực tiếp – interchange sort
Bước 3: Xét phần tử thứ ba (tại vị trí 3)
Kết thúc bước 3 15
10
9
7
5
3 3
4 5 6 7 8
1 1 1
2 2 2
3
27
j i
Đổi chổ trực tiếp – interchange sort
Bước 4: Xét phần tử thứ tư (tại vị trí 4)
15
10
9
7
5
3 3
1 1 1
2 2 2
4 5 3 7 6 8
28
j i
Đổi chổ trực tiếp – interchange sort
Bước 4: Xét phần tử thứ tư (tại vị trí 4)
15
10
9
7
5
3 3
1 1 1
2 2 2
3 7 6 8 4 5
29
i j
Đổi chổ trực tiếp – interchange sort
Bước 4: Xét phần tử thứ tư (tại vị trí 4)
15
10
9
7
5
3 3
1 1 1
2 2 2
3 5 6 4 7 8
30
j i
Đổi chổ trực tiếp – interchange sort
Bước 4: Xét phần tử thứ tư (tại vị trí 4)
15
10
9
7
5
3 3
1 1 1
2 2 2
3 5 6 4 7 8
31
i j
Đổi chổ trực tiếp – interchange sort
Bước 4: Xét phần tử thứ tư (tại vị trí 4)
Kết thúc bước 4 15
10
9
7
5 5
3 3
1 1 1
2 2 2
3 5 6 7 4 8
32
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í 5)
15
10
9
7
5 5
3 3
1 1 1
2 2 2
3 5 6 4 7 8
33
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í 5)
15
10
9
7
5 5
3 3
1 1 1
2 2 2
3 4 7 8 5 6
34
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í 5)
15
10
9
7
5 5
3 3
1 1 1
2 2 2
3 4 6 7 5 8
35
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í 5)
Kết thúc bước 5 15
10
9
7 7
5 5
3 3
1 1 1
2 2 2
3 4 6 7 8 5
36
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í 6)
15
10
9
7 7
5 5
3 3
1 1 1
2 2 2
3 4 6 7 5 8
37
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í 6)
15
10
9
7 7
5 5
3 3
1 1 1
2 2 2
3 4 5 8 6 7
38
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í 6)
Kết thúc bước 6 15
10
9 9
7 7
5 5
3 3
1 1 1
2 2 2
3 4 5 7 8 6
39
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í 7)
15
10
9 9
7 7
5 5
3 3
1 1 1
2 2 2
3 4 5 7 8 6
40
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í 7)
Kết thúc bước 7
15
10 10
9 9
7 7
5 5
3 3
1 1 1
2 2 2
3 4 5 6 7 8
41
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
3 3
11 1
2 2 2
3 4 5 7 8 6
42
Giải thuật
Bước 1 : i = 1;// 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 :

