Bài giảng Câu trúc dữ liệu và giải thuật - Chương 2: Tìm kiến và sắp xếp nội

Tóm tắt Bài giảng Câu trúc dữ liệu và giải thuật - Chương 2: Tìm kiến và sắp xếp nội: ... IẢ I T H U Ậ T 24 Đổi Chỗ Trực Tiếp – Interchange Sort i=1 j=2 i=1 j=3 i=1 j=4 5C Ấ U T R Ú C D Ữ L IỆ U V À G IẢ I T H U Ậ T 25 Đổi Chỗ Trực Tiếp – Interchange Sort i=2 j=6 i=2 j=4 i=2 j=3 C Ấ U T R Ú C D Ữ L IỆ U V À G IẢ I T H...a Thuật Toán  Ðánh giá giải thuật 1 1 ( 1) soá laàn so saùnh ( ) 2 n i n n n i       C Ấ U T R Ú C D Ữ L IỆ U V À G IẢ I T H U Ậ T 52 Các Thuật Toán Sắp Xếp 1. Đổi chỗ trực tiếp – Interchange Sort 2. Chọn trực tiếp – Selection Sort 3. Nổi bọt – ...khi dời chỗ các phần tử. for(i=1 ; i<n ; i++) //đoạn a[0] đã sắp { x = a[i]; pos = i-1; // tìm vị trí chèn x while((pos >= 0)&&(a[pos] > x)) {//kết hợp dời chỗ các phần tử sẽ đứng sau x trong dãy mới a[pos+1] = a[pos]; pos--; } a[pos+1] = x]; // chèn x vào dãy } } C Ấ U T...

pdf18 trang | Chia sẻ: havih72 | Lượt xem: 276 | Lượt tải: 0download
Nội dung tài liệu Bài giảng Câu trúc dữ liệu và giải thuật - Chương 2: Tìm kiến và sắp xếp nội, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Thuật Tốn Sắp Xếp
1. Đổi chỗ trực tiếp – Interchange Sort
2. Chọn trực tiếp – Selection Sort
3. Nổi bọt – Bubble Sort
4. Shaker Sort
5. Chèn trực tiếp – Insertion Sort
6. Chèn nhị phân – Binary Insertion Sort
7. Shell Sort
8. Heap Sort
9. Quick Sort
10. Merge Sort
11. Radix Sort
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
20
Các Thuật Tốn Sắp Xếp
1. Đổi chỗ trực tiếp – Interchange Sort
2. Chọn trực tiếp – Selection Sort
3. Nổi bọt – Bubble Sort
4. Shaker Sort
5. Chèn trực tiếp – Insertion Sort
6. Chèn nhị phân – Binary Insertion Sort
7. Shell Sort
8. Heap Sort
9. Quick Sort
10. Merge Sort
11. Radix Sort
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
21
Đổi Chỗ Trực Tiếp – Interchange Sort
 Ý tưởng: Xuất phát từ đầu dãy, tìm tất các 
các nghịch thế chứa phần tử này, triệt tiêu 
chúng bằng cách đổi chỗ 2 phần tử trong cặp 
nghịch thế. Lặp lại xử lý trên với phần tử kế 
trong dãy.
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
22
Các Bước Tiến Hành
 Bước 1: i = 0; // bắt đầu từ đầu dãy 
 Bước 2: j = i+1; //tìm các nghịch thế với a[i] 
 Bước 3: 
Trong khi j < N thực hiện 
Nếu a[j]<a[i] //xét cặp a[i], a[j]
Swap(a[i],a[j]); 
j = j+1;
 Bước 4: i = i+1; 
Nếu i < N-1: Lặp lại Bước 2. 
Ngược lại: Dừng. 
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
23
Đổi Chỗ Trực Tiếp – Interchange Sort
 Cho dãy số a: 
12 2 8 5 1 6 4 15 
j=1i=0
i=0 j=4
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
24
Đổi Chỗ Trực Tiếp – Interchange Sort
i=1 j=2
i=1 j=3
i=1 j=4
5C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
25
Đổi Chỗ Trực Tiếp – Interchange Sort
i=2 j=6
i=2 j=4
i=2 j=3
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
26
Đổi Chỗ Trực Tiếp – Interchange Sort
i=3 j=4
i=3 j=5
i=3 j=6
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
27
Đổi Chỗ Trực Tiếp – Interchange Sort
i=5 j=6
i=4 j=6
i=4 j=5
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
28
Đổi Chỗ Trực Tiếp – Interchange Sort
i=6 j=7
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
29
Cài Đặt Đổi Chỗ Trực Tiếp
void InterchangeSort(int a[], int N )
{
int i, j;
for (i = 0 ; i<N-1 ; i++)
for (j =i+1; j < N ; j++)
if(a[j ]< a[i]) // Thỏa 1 cặp nghịch thế
Swap(a[i], a[j]);
}
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
30
Minh Họa Thuật Tốn
2 8 5 1 6 4 1512
1 2 3 4 5 6 70
1
i
j
6C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
31
Minh Họa Thuật Tốn
12 8 5 2 6 4 151
1 2 3 4 5 6 70
2
0
i
j
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
32
Minh Họa Thuật Tốn
2 12 8 5 6 4 151
1 2 3 4 5 6 70
4
0
i
j
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
33
Minh Họa Thuật Tốn
2 4 12 8 6 5 151
1 2 3 4 5 6 70
5
0
i
j
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
34
Minh Họa Thuật Tốn
2 4 5 6 8 12 151
2 3 4 5 6 7 81
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
35
Độ Phức Tạp Của Thuật Tốn
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
36
Các Thuật Tốn Sắp Xếp
1. Đổi chỗ trực tiếp – Interchange Sort
2. Chọn trực tiếp – Selection Sort
3. Nổi bọt – Bubble Sort
4. Shaker Sort
5. Chèn trực tiếp – Insertion Sort
6. Chèn nhị phân – Binary Insertion Sort
7. Shell Sort
8. Heap Sort
9. Quick Sort
10. Merge Sort
11. Radix Sort
7C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
37
Chọn Trực Tiếp – Selection Sort
 Ý tưởng:
 Chọn phần tử nhỏ nhất trong N phần tử trong 
dãy hiện hành ban đầu.
 Đưa phần tử này về vị trí đầu dãy hiện hành
 Xem dãy hiện hành chỉ cịn N-1 phần tử của 
dãy hiện hành ban đầu
 Bắt đầu từ vị trí thứ 2;
 Lặp lại quá trình trên cho dãy hiện hành... 
đến khi dãy hiện hành chỉ cịn 1 phần tử 
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
38
Các Bước Của Thuật Tốn Chọn Trực Tiếp
 Bước 1: i = 0; 
 Bước 2: Tìm phần tử a[min] nhỏ nhất trong 
dãy hiện hành từ a[i] đến a[N] 
 Bước 3 : Đổi chỗ a[min] và a[i] 
 Bước 4 : Nếu i < N-1 thì 
i = i+1; Lặp lại Bước 2; 
Ngược lại: Dừng. 
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
39
Chọn Trực Tiếp – Selection Sort
 Cho dãy số a: 
12 2 8 5 1 6 4 15 
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
40
Chọn Trực Tiếp – Selection Sort
i=0
i=1
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
41
Chọn Trực Tiếp – Selection Sort
i=2
i=3
i=4
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
42
Chọn Trực Tiếp – Selection Sort
i=6
i=5
8C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
43
Cài Đặt Thuật Tốn Chọn Trực Tiếp
void SelectionSort(int a[],int n )
{
int min,i,j; // chỉ số phần tử nhỏ nhất trong dãy hiện hành 
for (i=0; i<n-1 ; i++) //chỉ số đầu tiên của dãy hiện hành
{
min = i;
for(j = i+1; j <N ; j++)
if (a[j ] < a[min]) 
min = j; // lưu vtrí phần tử hiện nhỏ nhất 
Swap(a[min],a[i]);
}
}
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
44
Minh Họa Thuật Tốn Chọn Trực Tiếp
2 8 5 1 6 4 1512
i
min
1 2 3 4 5 6 70
Vị trí nhỏ nhất(0,7) Swap(a[0], a[4])
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
45
Minh Họa Thuật Tốn Chọn Trực Tiếp
2 8 5 12 6 4 151
i
min
1 2 3 4 5 6 70
Vị trí nhỏ nhất(1,7) Swap(a[1], a[1])
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
46
Minh Họa Thuật Tốn Chọn Trực Tiếp
2 8 5 12 6 4 151
i
min
1 2 3 4 5 6 70
Vị trí nhỏ nhất(2,7) Swap(a[2], a[6])
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
47
Minh Họa Thuật Tốn Chọn Trực Tiếp
2 4 5 12 6 8 151
i
min
1 2 3 4 5 6 70
Vị trí nhỏ nhất(3, 7) Swap(a[3], a[3])
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
48
Minh Họa Thuật Tốn Chọn Trực Tiếp
2 4 5 12 6 8 151
i
min
1 2 3 4 5 6 70
Vị trí nhỏ nhất(4, 7) Swap(a[4], a[5])
9C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
49
Minh Họa Thuật Tốn Chọn Trực Tiếp
2 4 5 6 12 8 151
i
min
1 2 3 4 5 6 70
Vị trí nhỏ nhất(5,7) Swap(a[5], a[6])
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
50
Minh Họa Thuật Tốn Chọn Trực Tiếp
2 4 5 6 8 12 151
i
min
1 2 3 4 5 6 70
Vị trí nhỏ nhất(6, 7)
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
51
Độ Phức Tạo Của Thuật Tốn
 Ðánh giá giải thuật
1
1
( 1)
số lần so sánh ( )
2
n
i
n n
n i



  
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
52
Các Thuật Tốn Sắp Xếp
1. Đổi chỗ trực tiếp – Interchange Sort
2. Chọn trực tiếp – Selection Sort
3. Nổi bọt – Bubble Sort
4. Shaker Sort
5. Chèn trực tiếp – Insertion Sort
6. Chèn nhị phân – Binary Insertion Sort
7. Shell Sort
8. Heap Sort
9. Quick Sort
10. Merge Sort
11. Radix Sort
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
53
Nổi Bọt – Bubble Sort
 Ý tưởng:
 Xuất phát từ cuối dãy, đổi chỗ các cặp phần 
tử kế cận để đưa phần tử nhỏ hơn trong cặp 
phần tử đĩ về vị trí đúng đầu dãy hiện hành, 
sau đĩ sẽ khơng xét đến nĩ ở bước tiếp theo, 
do vậy ở lần xử lý thứ i sẽ cĩ vị trí đầu dãy là 
i. 
 Lặp lại xử lý trên cho đến khi khơng cịn cặp 
phần tử nào để xét.
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
54
Nổi Bọt – Bubble Sort
 Bước 1 : i = 0; // lần xử lý đầu tiên 
 Bước 2 : j = N-1;//Duyệt từ cuối dãy ngược về vị trí i 
Trong khi (j > i) thực hiện: 
Nếu a[j]<a[j-1] 
Doicho(a[j],a[j-1]);
j = j-1;
 Bước 3 : i = i+1; // lần xử lý kế tiếp
Nếu i >=N-1: Hết dãy. Dừng
Ngược lại : Lặp lại Bước 2. 
10
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
55
Nổi Bọt – Bubble Sort
 Cho dãy số a: 
2 12 8 5 1 6 4 15 
i=0 j=6
i=0 i=4
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
56
Nổi Bọt – Bubble Sort
i=0 j=1
i=0 j=2
i=0 j=3
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
57
Nổi Bọt – Bubble Sort
i=1 j=3
i=1 j=4
i=1 j=5
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
58
Nổi Bọt – Bubble Sort
i=2 j=5
i=2 j=4
i=3 j=6 C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
59
Nổi Bọt – Bubble Sort
i=5
i=4 j=6
i=3 j=5
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
60
Cài Đặt Thuật Tốn Nổi Bọt
void BubbleSort(int a[],int n)
{
int i, j;
for (i = 0 ; i<n-1 ; i++)
for (j =n-1; j >i ; j --)
if(a[j]< a[j-1])// nếu sai vị trí thì đổi chỗ
Swap(a[j], a[j-1]);
}
11
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
61
Minh Họa Thuật Tốn
2 8 5 1 6 4 1512
1 2 3 4 5 6 70
i
j
1
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
62
Minh Họa Thuật Tốn
12 2 8 5 4 6 151
1 2 3 4 5 6 70
i
j
2
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
63
Minh Họa Thuật Tốn
2 12 4 8 5 6 151
1 2 3 4 5 6 70
i
j
4
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
64
Minh Họa Thuật Tốn
2 4 12 8 5 6 151
1 2 3 4 5 6 70
i
j
5
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
65
Minh Họa Thuật Tốn
2 4 5 12 8 6 151
1 2 3 4 5 6 70
i
j
6
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
66
Minh Họa Thuật Tốn
2 4 5 6 12 8 151
1 2 3 4 5 6 70
i
j
8
12
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
67
Minh Họa Thuật Tốn
2 4 5 6 8 12 151
2 3 4 5 6 7 81
i
j
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
68
Độ Phức Tạp Của Thuật Tốn Nổi Bọt
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
69
Các Thuật Tốn Sắp Xếp
1. Đổi chỗ trực tiếp – Interchange Sort
2. Chọn trực tiếp – Selection Sort
3. Nổi bọt – Bubble Sort
4. Shaker Sort
5. Chèn trực tiếp – Insertion Sort
6. Chèn nhị phân – Binary Insertion Sort
7. Shell Sort
8. Heap Sort
9. Quick Sort
10. Merge Sort
11. Radix Sort
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
70
Chèn Trực Tiếp – Insertion Sort
 Giả sử cĩ một dãy a0 , a1 ,... ,an-1 trong đĩ i phần 
tử đầu tiên a0 , a1 ,... ,ai-1 đã cĩ thứ tự. 
 Tìm cách chèn phần tử ai vào vị trí thích hợp của 
đoạn đã được sắp để cĩ dãy mới a0 , a1,... ,ai trở 
nên cĩ thứ tự. Vị trí này chính là vị trí giữa hai 
phần tử ak-1 và ak thỏa ak-1 < ai < ak (1≤k≤i). 
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
71
Chèn Trực Tiếp – Insertion Sort
 Bước 1: i = 1; //giả sử cĩ đoạn a[1] đã được sắp
 Bước 2: x = a[i]; Tìm vị trí pos thích hợp trong
đoạn a[1] đến a[i-1] để chèn a[i] vào
 Bước 3: Dời chỗ các phần tử từ a[pos] đến a[i-1] 
sang phải 1 vị trí để dành chổ cho a[i] 
 Bước 4: a[pos] = x; //cĩ đoạn a[1]..a[i] đã được sắp
 Bước 5: i = i+1; 
Nếu i < n : Lặp lại Bước 2 
Ngược lại : Dừng
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
72
Chèn Trực Tiếp – Insertion Sort
 Cho dãy số :
12 2 8 5 1 6 4 15 
i=1
i=2
13
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
73
Chèn Trực Tiếp – Insertion Sort
i=3
i=4
i=5
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
74
Chèn Trực Tiếp – Insertion Sort
i=6
i=7
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
75
Cài Đặt Thuật Tốn Chèn Trực Tiếp
void InsertionSort(int d, int n )
{ int pos, i;
int x;//lưu giá trị a[i] tránh bị ghi đè khi dời chỗ các phần tử.
for(i=1 ; i<n ; i++) //đoạn a[0] đã sắp
{
x = a[i]; pos = i-1;
// tìm vị trí chèn x
while((pos >= 0)&&(a[pos] > x))
{//kết hợp dời chỗ các phần tử sẽ đứng sau x trong dãy 
mới
a[pos+1] = a[pos];
pos--;
}
a[pos+1] = x]; // chèn x vào dãy
}
}
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
76
Minh Họa Thuật Tốn Insertion Sort
2 8 5 1 6 4 1512
1 2 3 4 5 6 70
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
77
2 8 5 1 6 4 1512
i
x
1 2 3 4 5 6 70
pos
2
Minh Họa Thuật Tốn Insertion Sort
Insert a[1] into (0,0)
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
78
12 8 5 1 6 4 152
i
x
1 2 3 4 5 6 70
pos
Minh Họa Thuật Tốn Insertion Sort
Insert a[2] into (0, 1)
8
14
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
79
8 12 5 1 6 4 152
i
x
1 2 3 4 5 6 70
pos
Minh Họa Thuật Tốn Insertion Sort
Insert a[3] into (0, 2)
5
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
80
5 8 12 1 6 4 152
i
x
1 2 3 4 5 6 70
pos
Minh Họa Thuật Tốn Insertion Sort
Insert a[4] into (0, 3)
1
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
81
2 5 8 12 6 4 151
i
x
1 2 3 4 5 6 70
pos
Minh Họa Thuật Tốn Insertion Sort
Insert a[5] into (0, 4)
6
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
82
2 5 6 8 12 4 151
i
x
1 2 3 4 5 6 70
pos
Minh Họa Thuật Tốn Insertion Sort
Insert a[6] into (0, 5)
4
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
83
2 4 5 6 8 12 151
i
x
1 2 3 4 5 6 70
pos
Minh Họa Thuật Tốn Insertion Sort
Insert a[8] into (0, 6)
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
84
2 4 5 6 8 12 151
pos
1 2 3 4 5 6 70
Minh Họa Thuật Tốn Insertion Sort
15
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
85
Độ Phức Tạp Của Insertion Sort
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
86
Các Thuật Tốn Sắp Xếp
1. Đổi chỗ trực tiếp – Interchange Sort
2. Chọn trực tiếp – Selection Sort
3. Nổi bọt – Bubble Sort
4. Shaker Sort
5. Chèn trực tiếp – Insertion Sort
6. Chèn nhị phân – Binary Insertion Sort
7. Shell Sort
8. Heap Sort
9. Quick Sort
10. Merge Sort
11. Radix Sort
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
87
Quick Sort 
 Ý tưởng:
 Giải thuật QuickSort sắp xếp dãy a1, a2 ..., aN dựa trên
việc phân hoạch dãy ban đầu thành 3 phần :
• Phần 1: Gồm các phần tử cĩ giá trị bé hơn 
x
• Phần 2: Gồm các phần tử cĩ giá trị bằng x
• Phần 3: Gồm các phần tử cĩ giá trị lớn 
hơn x
với x là giá trị của một phần tử tùy ý trong dãy ban 
đầu.
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
88
Quick Sort - Ý Tưởng
 Sau khi thực hiện phân hoạch, dãy ban đầu được phân
thành 3 đoạn:
• 1. ak ≤ x , với k = 1 .. j
• 2. ak = x , với k = j+1 .. i-1
• 3. ak  x , với k = i..N
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
89
 Đoạn thứ 2 đã cĩ thứ tự. 
 Nếu các đoạn 1 và 3 chỉ cĩ 1 phần tử : đã cĩ thứ tự
 khi đĩ dãy con ban đầu đã được sắp. 
Quick Sort – Ý Tưởng
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
90
 Đoạn thứ 2 đã cĩ thứ tự. 
 Nếu các đoạn 1 và 3 cĩ nhiều hơn 1 phần tử thì dãy 
ban đầu chỉ cĩ thứ tự khi các đoạn 1, 3 được sắp. 
 Để sắp xếp các đoạn 1 và 3, ta lần lượt tiến hành việc 
phân hoạch từng dãy con theo cùng phương pháp 
phân hoạch dãy ban đầu vừa trình bày 
Quick Sort – Ý Tưởng
16
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
91
Giải Thuật Quick Sort
 Bước 1: Nếu left ≥ right //dãy cĩ ít hơn 2 phần tử
Kết thúc; //dãy đã được sắp xếp
 Bước 2: Phân hoạch dãy aleft  aright thành các đoạn: 
aleft.. aj, aj+1.. ai-1, ai.. aright
Đoạn 1  x 
Đoạn 2: aj+1.. ai-1 = x 
Đoạn 3: ai.. aright  x
 Bước 3: Sắp xếp đoạn 1: aleft.. aj
 Bước 4: Sắp xếp đoạn 3: ai.. aright
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
92
Giải Thuật Quick Sort
 Bước 1 : Chọn tùy ý một phần tử a[k] trong dãy là 
giá trị mốc ( l ≤ k ≤ r): 
x = a[k]; i = l; j = r; 
 Bước 2 : Phát hiện và hiệu chỉnh cặp phần tử 
a[i], a[j] nằm sai chỗ : 
 Bước 2a : Trong khi (a[i]<x) i++; 
 Bước 2b : Trong khi (a[j]>x) j--; 
 Bước 2c : Nếu i< j Đoicho(a[i],a[j]); 
 Bước 3 : Nếu i < j: Lặp lại Bước 2.
Ngược lại: Dừng
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
93
Quick Sort – Ví Dụ
 Cho dãy số a: 
12 2 8 5
1 6 4 15 
Phân hoạch đoạn l =0, r = 7: x = a[3] = 5
12 2 8 5 1 6 4 15
l=0 r=7
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
94
Quick Sort – Ví Dụ
l=0 r=7
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
95
Quick Sort – Ví Dụ
 Phân hoạch đoạn l =0, r = 2:
x = a[2] = 2
l=0 r=2
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
96
Quick Sort – Ví Dụ
 Phân hoạch đoạn l = 4, r = 7:
x = a[5] = 6
l=4 r=7
17
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
97
 Phân hoạch đoạn l = 6, r = 7:
x = a[6] = 6
l=6 r=7
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
98
Quick Sort
void QuickSort(int a[], int left, int right)
{ int i, j, x;
x = a[(left+right)/2];
i = left; j = right;
while(i < j)
{
while(a[i] < x) i++;
while(a[j] > x) j--;
if(i <= j)
{ 
Doicho(a[i],a[j]);
i++ ; j--;
}
}
if(left<j)
QuickSort(a, left, j);
if(i<right)
QuickSort(a, i, right);
}
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
99
Quick Sort – Ví Dụ
2 8 1 6 4 1512
1 2 3 4 5 6 70
left right
STOP 
Not less than X
i j
STOP 
Not greater than X
Phân hoạch dãy
5
X
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
100
Quick Sort – Ví Dụ
2 8 5 1 6 12 154
2 3 4 5 6 7 81
left right
5X
STOP 
Khơng nhỏ hơn X
i j
STOP 
Khơng lớn hơn X
Phân hoạch dãy
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
101
Quick Sort – Ví Dụ
2 1 5 8 6 12 154
2 3 4 5 6 7 81
left right
ij
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
102
6X
Quick Sort – Ví Dụ
2 4 5 8 6 12 151
2 3 4 5 6 7 81
left right
i j
STOP 
Khơng nhỏ hơn X
STOP 
Khơng lớn hơn X
Sắp xếp đoạn 3
Phân hoạch dãy
18
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
103
Quick Sort – Ví Dụ
2 4 5 6 8 12 151
2 3 4 5 6 7 81
left right
ij
Sắp xếp đoạn 3
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
104
Độ Phức Tạp Của Quick Sort
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
105
Sorting Algorithms 
 Demo
 Animation of sorting algorithms
 
 
demo.html
 
 
(heap sort)
 
(quick sort)
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
106
Sorting Algorithms Comparison
Method
Average 
Time
Best Time Worst Time
Auxiliary 
Space
Sort In 
Place
Stability
Simple Sort 
(Selection, 
Insertion, 
Bubble, )
O(n2)
O(n2) /
O(n) /
O(n)
O(n2) O(1) Yes Yes
Quick Sort O(nlogn) O(nlogn) O(n2)
(logn)
(stack size)
Yes No
Heap Sort O(nlogn) O(nlogn) O(nlogn) O(1) Yes No
Merge Sort O(nlogn) O(nlogn) O(nlogn) O(n) No Yes
Radix Sort O((n+r)k) O((n+r)k) O((n+r)k) O(rk) No Yes
C
Ấ
U
 T
R
Ú
C
 D
Ữ
 L
IỆ
U
 V
À
 G
IẢ
I 
T
H
U
Ậ
T
107
Bài Tập
 Nhập một dãy số nguyên n phần tử.
 Sắp xếp lại dãy sao cho: 
 số nguyên dương đầu ở đầu dãy và 
theo thứ tự giảm.
 số nguyên âm tăng ở cuối dãy và theo 
thứ tự tăng.
 số 0 ở giữa.
 Lưu ý: Khơng dùng đổi chỗ trực tiếp.

File đính kèm:

  • pdfbai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_2_tim_kien_v.pdf