SlideShare a Scribd company logo
CHƯƠNG 2: SẮP XẾP
(SORTING)
Giáo viên: PHẠM TUẤN HIỆPCTDL&GT
Nội dung
 Tổng quan
 Các phương pháp sắp xếp thông dụng
Chương 2: Sắp xếp
2
Tổng quan
 Tại sao phải sắp xếp?
 Để có thể sử dụng thuật toán tìm nhị phân
 Để thực hiện thao tác nào đó được nhanh hơn
 Định nghĩa bài toán sắp xếp
 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 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
Chương 2: Sắp xếp
 Khái niệm nghịch thế:
 Xét một mảng các số a[0], a[1], … a[n-1]
 Nếu có i<j và a[i] > a[j], thì ta gọi đó là một nghịch thế
 Mảng chưa sắp xếp sẽ có nghịch thế
 Mảng đã có thứ tự sẽ không chứa nghịch thế
a[0] a[1] … a[n -1]
4
Tổng quan
Chương 2: Sắp xếp
Các phương pháp sắp xếp thông dụng
 Phương pháp Đổi chỗ trực tiếp (Interchange sort)
 Phương pháp Nổi bọt (Bubble sort)
 Phương pháp Chèn trực tiếp (Insertion sort)
 Phương pháp Chọn trực tiếp (Selection sort)
 Phương pháp dựa trên phân hoạch (Quick sort)
5
Chương 2: Sắp xếp
Interchange Sort – Ý tưởng
 Nhận xét:
 Để sắp xếp một dãy số, ta có thể xét các nghịch thế có trong dãy
và làm triệt tiêu dần chúng đi
 Ý 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ỗ 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
6
Chương 2: Sắp xếp
Interchange Sort – Ví dụ
2 8 5 1 6 4 1512
1 2 3 4 5 6 70
i
j
1
Nếu a[i] > a[j] thì đổi chỗ a[i], a[j]
7
Chương 2: Sắp xếp
12 8 5 2 6 4 151
1 2 3 4 5 6 70
i
j
2
Nếu a[i] > a[j] thì đổi chỗ a[i], a[j]
Interchange Sort – Ví dụ
8
Chương 2: Sắp xếp
Interchange Sort – Ví dụ
2 12 8 5 6 4 151
1 2 3 4 5 6 70
i
j
4
Nếu a[i] > a[j] thì đổi chỗ a[i], a[j]
9
Chương 2: Sắp xếp
Interchange Sort – Ví dụ
2 4 12 8 6 5 151
1 2 3 4 5 6 70
i
j
5
Nếu a[i] > a[j] thì đổi chỗ a[i], a[j]
10
Chương 2: Sắp xếp
Interchange Sort – Ví dụ
2 4 5 6 8 12 151
1 2 3 4 5 6 70
Nếu a[i] > a[j] thì đổi chỗ a[i], a[j]
11
Chương 2: Sắp xếp
Interchange Sort – Thuật toán
// input: dãy (a, n)
// output: dãy (a, n) đã được sắp xếp
 Bước 1: i = 0; // bắt đầu từ đầu dãy
 Bước 2: j = i+1;
 Bước 3: Trong khi j < n thực hiện:
 Nếu a[i]>a[j] thì đổi chỗ 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
12
Chương 2: Sắp xếp
Interchange Sort - Cài đặt
void InterchangeSort(int a[], int n)
{
for (int i=0 ; i<n-1 ; i++)
for (int j=i+1; j<n ; j++)
if(a[j]<a[i]) //nếu có nghịch thế thì đổi chỗ
HoanVi(a[i], a[j]);
}
void HoanVi(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
13
Chương 2: Sắp xếp
Các phương pháp sắp xếp thông dụng
 Phương pháp Đổi chỗ trực tiếp (Interchange sort)
 Phương pháp Nổi bọt (Bubble sort)
 Phương pháp Chèn trực tiếp (Insertion sort)
 Phương pháp Chọn trực tiếp (Selection sort)
 Phương pháp dựa trên phân hoạch (Quick sort)
14
Chương 2: Sắp xếp
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í đầu dãy hiện
hành, sau đó sẽ không xét đến nó ở bước tiếp theo
 Ở lần xử lý thứ i 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
15
Chương 2: Sắp xếp
Bubble Sort – Ví dụ
2 8 5 1 6 4 1512
1 2 3 4 5 6 70
i
j
1
Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]
16
Chương 2: Sắp xếp
Bubble Sort – Ví dụ
12 2 8 5 4 6 151
1 2 3 4 5 6 70
i
j
2
Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]
17
Chương 2: Sắp xếp
Bubble Sort – Ví dụ
2 12 4 8 5 6 151
1 2 3 4 5 6 70
i
j
4
Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]
18
Chương 2: Sắp xếp
Bubble Sort – Ví dụ
2 4 12 8 5 6 151
1 2 3 4 5 6 70
i
j
5
Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]
19
Chương 2: Sắp xếp
Bubble Sort – Ví dụ
2 4 5 12 8 6 151
1 2 3 4 5 6 70
i
j
6
Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]
20
Chương 2: Sắp xếp
Bubble Sort – Ví dụ
2 4 5 6 12 8 151
1 2 3 4 5 6 70
i
j
8
Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]
21
Chương 2: Sắp xếp
Bubble Sort – Ví dụ
2 4 5 6 8 12 151
1 2 3 4 5 6 70
i
j
1512
Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1]
22
Chương 2: Sắp xếp
Bubble Sort – Thuật toán
// input: dãy (a, n)
// output: dãy (a, n) đã được sắp xếp
 Bước 1: i = 0;
 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] thì đổi chỗ 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: Dừng // Hết dãy
 Ngược lại: Lặp lại Bước 2
23
Chương 2: Sắp xếp
Bubble Sort - Cài đặt
void BubbleSort(int a[], int n)
{
for (int i=0; i<n-1; i++)
for (int j=n-1; j>i; j--)
if(a[j] < a[j-1])
HoanVi(a[j], a[j-1]);
}
24
Chương 2: Sắp xếp
Các phương pháp sắp xếp thông dụng
 Phương pháp Đổi chỗ trực tiếp (Interchange sort)
 Phương pháp Nổi bọt (Bubble sort)
 Phương pháp Chèn trực tiếp (Insertion sort)
 Phương pháp Chọn trực tiếp (Selection sort)
 Phương pháp dựa trên phân hoạch (Quick sort)
25
Chương 2: Sắp xếp
Insertion Sort – Ý tưởng
 Nhận xét:
 Mọi dãy a[0] , a[1] ,..., a[n-1] luôn có i-1 phần tử đầu tiên a[0]
, a[1] ,... , a[i-2] đã có thứ tự (i ≥ 2)
 Ý tưởng chính:
 Tìm cách chèn phần tử a[i] vào vị trí thích hợp của đoạn đã được
sắp để có dãy mới a[0] , a[1] ,... , a[i-1] trở nên có thứ tự
 Vị trí này chính là pos thỏa :
a[pos-1] a[i ]< a[pos] (1 pos i)
26
Chương 2: Sắp xếp
Insertion Sort – Ý tưởng
Chi tiết hơn:
 Dãy ban đầu a[0] , a[1] ,..., a[n-1], xem như đã có đoạn gồm một
phần tử a[0] đã được sắp
 Thêm a[1] vào đoạn a[0] sẽ có đoạn a[0] a[1] được sắp
 Thêm a[2] vào đoạn a[0] a[1] để có đoạn a[0] a[1] a[2] được
sắp
 Tiếp tục cho đến khi thêm xong a[n-1] vào đoạn a[0] a[1] ...a[n-1]
sẽ có dãy a[0] a[1]….... A[n-1] được sắp
27
Chương 2: Sắp xếp
Insertion Sort – Ví dụ
2 8 5 1 6 4 1512
1 2 3 4 5 6 70
28
Chương 2: Sắp xếp
Insertion Sort – Ví dụ
2 8 5 1 6 4 1512
i
x
1 2 3 4 5 6 70
pos
2
Chèn a[1] vào (a[0], a[1])
29
Chương 2: Sắp xếp
Insertion Sort – Ví dụ
12 8 5 1 6 4 152
i
x
1 2 3 4 5 6 70
pos
Chèn a[2] vào (a[0] … a[2])
8
30
Chương 2: Sắp xếp
Insertion Sort – Ví dụ
8 12 5 1 6 4 152
i
x
1 2 3 4 5 6 70
pos
Chèn a[3] vào (a[0] … a[3])
5
31
Chương 2: Sắp xếp
Insertion Sort – Ví dụ
5 8 12 1 6 4 152
i
x
1 2 3 4 5 6 70
pos
Chèn a[4] vào (a[0] … a[4])
1
32
Chương 2: Sắp xếp
Insertion Sort – Ví dụ
2 5 8 12 6 4 151
i
x
1 2 3 4 5 6 70
pos
Chèn a[5] vào (a[0]… a[5])
6
33
Chương 2: Sắp xếp
Insertion Sort – Ví dụ
2 5 6 8 12 4 151
i
x
1 2 3 4 5 6 70
pos
Chèn a[6] vào (a[0] … a[6])
4
34
Chương 2: Sắp xếp
Insertion Sort – Ví dụ
2 4 5 6 8 12 151
i
x
1 2 3 4 5 6 70
pos
Chèn a[7] vào (a[0] … a[7])
15
35
Chương 2: Sắp xếp
Insertion Sort – Ví dụ
2 4 5 6 8 12 151
pos
1 2 3 4 5 6 70
36
Chương 2: Sắp xếp
Insertion Sort – Thuật toán
// input: dãy (a, n)
// output: dãy (a, n) đã được sắp xếp
 Bước 1: i = 1; // giả sử có đoạn a[0] đã được sắp
 Bước 2: x = a[i]; //Tìm vị trí pos thích hợp trong đoạn a[0]
//đến a[i] để chèn x 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 x
 Bước 4: a[pos] = x; // có đoạn a[0]..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
37
Chương 2: Sắp xếp
Insertion Sort – Cài đặt
void InsertionSort(int a[], int n){
int pos, x;
for(int i=1; i<n; i++) //đoạn a[0] đã sắp
{
x = a[i];
pos = i;
while(pos>0 && x<a[pos-1])
{ a[pos] = a[pos-1]; // dời chỗ
pos--;
}
a[pos] = x;
}
}
38
Chương 2: Sắp xếp
Các phương pháp sắp xếp thông dụng
 Phương pháp Đổi chỗ trực tiếp (Interchange sort)
 Phương pháp Nổi bọt (Bubble sort)
 Phương pháp Chèn trực tiếp (Insertion sort)
 Phương pháp Chọn trực tiếp (Selection sort)
 Phương pháp dựa trên phân hoạch (Quick sort)
39
Chương 2: Sắp xếp
Selection Sort – Ý tưởng
 Ý tưởng: mô phỏng một trong những cách sắp xếp tự nhiên
nhất trong thực tế:
 Chọn phần tử nhỏ nhất trong n phần tử ban đầu, đưa phần tử này
về vị trí đúng là đầ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 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ử
40
Chương 2: Sắp xếp
Selection Sort – Ví dụ
2 8 5 1 6 4 1512
i
min
1 2 3 4 5 6 70
Find MinPos(0, 7) Swap(a[i], a[min])
41
Chương 2: Sắp xếp
Selection Sort – Ví dụ
2 8 5 12 6 4 151
i
min
1 2 3 4 5 6 70
Find MinPos(1, 7) Swap(a[i], a[min])
42
Chương 2: Sắp xếp
Selection Sort – Ví dụ
2 8 5 12 6 4 151
i
min
1 2 3 4 5 6 70
Find MinPos(2, 7) Swap(a[i], a[min])
43
Chương 2: Sắp xếp
Selection Sort – Ví dụ
2 4 5 12 6 8 151
i
min
1 2 3 4 5 6 70
Find MinPos(3, 7) Swap(a[i], a[min])
44
Chương 2: Sắp xếp
Selection Sort – Ví dụ
2 4 5 12 6 8 151
i
min
1 2 3 4 5 6 70
Find MinPos(4, 7) Swap(a[i], a[min])
45
Chương 2: Sắp xếp
Selection Sort – Ví dụ
2 4 5 6 12 8 151
i
min
1 2 3 4 5 6 70
Find MinPos(5, 7) Swap(a[i], a[min])
46
Chương 2: Sắp xếp
Selection Sort – Ví dụ
2 4 5 6 8 12 151
i
min
1 2 3 4 5 6 70
Find MinPos(6, 7) Swap(a[i], a[min])
12 15
47
Selection Sort – Thuật toán
// input: dãy (a, n)
// output: dãy (a, n) đã được sắp xế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-1]
 Bước 3 : Nếu min i: Đổi chỗ a[min] và a[i]
 Bước 4 : Nếu i < n:
 i =i+1
 Lặp lại Bước 2
Ngược lại: Dừng. //n phần tử đã nằm đúng vị trí
48
Selection Sort – Cài đặt
void SelectionSort(int a[], int n)
{
int min; // chỉ số phần tử nhỏ nhất trong dãy hiện hành
for (int i=0; i<n-1; i++)
{
min = i;
for(int j = i+1; j<n; j++)
if (a[j] < a[min])
min = j; // ghi nhận vị trí phần tử nhỏ nhất
if (min != i)
HoanVi(a[min], a[i]);
}
}
49
Các phương pháp sắp xếp thông dụng
 Phương pháp Đổi chỗ trực tiếp (Interchange sort)
 Phương pháp Nổi bọt (Bubble sort)
 Phương pháp Chèn trực tiếp (Insertion sort)
 Phương pháp Chọn trực tiếp (Selection sort)
 Phương pháp dựa trên phân hoạch (Quick sort)
50
Chương 2: Sắp xếp
Quick Sort – Ý tưởng
 Ý tưởng:
 Chia dãy cần sắp thành 2 phần
 ½ dãy bên trái chứa các giá trị nhỏ hơn ½ dãy bên phải
 Thực hiện việc sắp xếp trên từng dãy con
51
Chương 2: Sắp xếp
Quick Sort – Ví dụ
2 8 5 1 6 4 1512
1 2 3 4 5 6 70
left right
5X
STOP
Khi >= x
i j
STOP
Khi <= x
Phân hoạch dãy
52
Quick Sort – Ví dụ
2 8 5 1 6 12 154
1 2 3 4 5 6 70
left right
5X
STOP
Khi >= x
i j
STOP
Khi<= x
Phân hoạch dãy
53
Chương 2: Sắp xếp
Quick Sort – Ví dụ
2 1 5 8 6 12 154
1 2 3 4 5 6 70
left right
ij
54
Chương 2: Sắp xếp
Quick Sort – Ví dụ
6X
2 4 5 8 6 12 151
1 2 3 4 5 6 70
left right
i j
STOP
Khi >= x
STOP
Khi <= x
Sắp xếp đoạn 3
Phân hoạch dãy
55
Chương 2: Sắp xếp
Quick Sort – Ví dụ
2 4 5 6 8 12 151
1 2 3 4 5 6 70
left right
ij
Sắp xếp đoạn 3
56
Chương 2: Sắp xếp
Quick Sort – Ví dụ
2 4 5 6 8 12 151
1 2 3 4 5 6 70
57
Chương 2: Sắp xếp
Quick Sort – Phân hoạch dãy
// input: dãy (a, n)
// output: dãy con chia thành 2 đoạn: đoạn 1 ≤ x ≤ đoạn 2
 Bước 1: Chọn tùy ý một phần tử x trong dãy giá trị mốc:
x = a[(left+right)/2];
 Bước 2: Duyệt từ 2 đầu dãy để phát hiện và hiệu chỉnh cặp phần tử
a[i], a[j] vi phạm điều kiện
 Bước 2.1: i = left; j = right;
 Bước 2.2: Trong khi (a[i]<x) i++;
 Bước 2.3: Trong khi (a[j]>x) j--;
 Bước 2.4: Nếu i<= j
 Hoán vị (a[i], a[j]); i++; j--;
 Bước 2.5: Nếu i < j: Lặp lại Bước 2.2 //chưa xét hết mảng
//Hết duyệt
58
Chương 2: Sắp xếp
Quick Sort – Cài đặt
void QuickSort(int a[], int left, int right)
{
int i, j, x;
if (left right) return;
x = a[(left+right)/2]; // chọn phần tử giữa làm giá trị mốc
i = left; j = right;
do{
while(a[i] < x) i++;
while(a[j] > x) j--;
if(i <= j) {
HoanVi(a[i], a[j]);
i++ ; j--;
}
} while(i < j);
if(left<j) QuickSort(a, left, j);
if(i<right) QuickSort(a, i, right);
}
59

More Related Content

Similar to C2 sap xep

Chuong 2 Tim Kiem N Sap Xep
Chuong 2   Tim Kiem N Sap XepChuong 2   Tim Kiem N Sap Xep
Chuong 2 Tim Kiem N Sap Xep
quang
 
Chuong 2 Tim Kiem N Sap Xep
Chuong 2   Tim Kiem N Sap XepChuong 2   Tim Kiem N Sap Xep
Chuong 2 Tim Kiem N Sap Xepquang
 
Sap xep va tim kiem
Sap xep va tim kiem Sap xep va tim kiem
Sap xep va tim kiem acumenvn
 
Tìm kiếm và sắp nội
Tìm kiếm và sắp nộiTìm kiếm và sắp nội
Tìm kiếm và sắp nội
kikihoho
 
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢNTÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢNTrần Nguyên
 
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTBài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
MasterCode.vn
 
Bai3 timkiemsapxep
Bai3 timkiemsapxepBai3 timkiemsapxep
Bai3 timkiemsapxepnhà tôi
 
Bai3 timkiem sapxep
Bai3 timkiem sapxepBai3 timkiem sapxep
Bai3 timkiem sapxepHồ Lợi
 
Ctdl C08
Ctdl C08Ctdl C08
Ctdl C08giang
 
Ctdl lab07-cac thuat-toan_sap_xep
Ctdl lab07-cac thuat-toan_sap_xepCtdl lab07-cac thuat-toan_sap_xep
Ctdl lab07-cac thuat-toan_sap_xepNguyễn Ngọc Hà
 
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
Chuong 2  phan tich cac thuat toan sap xep va tim kiemChuong 2  phan tich cac thuat toan sap xep va tim kiem
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
gaconne1985
 
CHƯƠNG 4.pdf
CHƯƠNG 4.pdfCHƯƠNG 4.pdf
CHƯƠNG 4.pdf
D20CQVT01NTRANHAMY
 
3giaithuatsxep t lan
3giaithuatsxep t lan3giaithuatsxep t lan
3giaithuatsxep t lan
Rung Rinh
 
02 stack queue
02 stack queue02 stack queue
02 stack queuelanheo04
 
Bài t#u1eadp bài 3
Bài t#u1eadp bài 3Bài t#u1eadp bài 3
Bài t#u1eadp bài 3Hồ Lợi
 
Chap2 new (tran dai's conflicted copy 2013 04-02)
Chap2 new (tran dai's conflicted copy 2013 04-02)Chap2 new (tran dai's conflicted copy 2013 04-02)
Chap2 new (tran dai's conflicted copy 2013 04-02)Loc Tran
 
Baigiang - bai4. Bài Toán Và Thuật Toán
Baigiang - bai4. Bài Toán Và Thuật ToánBaigiang - bai4. Bài Toán Và Thuật Toán
Baigiang - bai4. Bài Toán Và Thuật Toán
Van Vo
 
Bài tập CTDL và GT 1
Bài tập CTDL và GT 1Bài tập CTDL và GT 1
Bài tập CTDL và GT 1
Hồ Lợi
 

Similar to C2 sap xep (20)

Chuong 2 Tim Kiem N Sap Xep
Chuong 2   Tim Kiem N Sap XepChuong 2   Tim Kiem N Sap Xep
Chuong 2 Tim Kiem N Sap Xep
 
Chuong 2 Tim Kiem N Sap Xep
Chuong 2   Tim Kiem N Sap XepChuong 2   Tim Kiem N Sap Xep
Chuong 2 Tim Kiem N Sap Xep
 
Sap xep va tim kiem
Sap xep va tim kiem Sap xep va tim kiem
Sap xep va tim kiem
 
Tìm kiếm và sắp nội
Tìm kiếm và sắp nộiTìm kiếm và sắp nội
Tìm kiếm và sắp nội
 
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢNTÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN
TÌM HIỂU VỀ MỘT SỐ THUẬT TOÁN SẮP XẾP ĐƠN GIẢN
 
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTBài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
 
Bai3 timkiemsapxep
Bai3 timkiemsapxepBai3 timkiemsapxep
Bai3 timkiemsapxep
 
Bai3 timkiem sapxep
Bai3 timkiem sapxepBai3 timkiem sapxep
Bai3 timkiem sapxep
 
Chuong 2
Chuong 2Chuong 2
Chuong 2
 
Ctdl C08
Ctdl C08Ctdl C08
Ctdl C08
 
Ctdl lab07-cac thuat-toan_sap_xep
Ctdl lab07-cac thuat-toan_sap_xepCtdl lab07-cac thuat-toan_sap_xep
Ctdl lab07-cac thuat-toan_sap_xep
 
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
Chuong 2  phan tich cac thuat toan sap xep va tim kiemChuong 2  phan tich cac thuat toan sap xep va tim kiem
Chuong 2 phan tich cac thuat toan sap xep va tim kiem
 
CHƯƠNG 4.pdf
CHƯƠNG 4.pdfCHƯƠNG 4.pdf
CHƯƠNG 4.pdf
 
3giaithuatsxep t lan
3giaithuatsxep t lan3giaithuatsxep t lan
3giaithuatsxep t lan
 
02 stack queue
02 stack queue02 stack queue
02 stack queue
 
Bài t#u1eadp bài 3
Bài t#u1eadp bài 3Bài t#u1eadp bài 3
Bài t#u1eadp bài 3
 
Chap2 new (tran dai's conflicted copy 2013 04-02)
Chap2 new (tran dai's conflicted copy 2013 04-02)Chap2 new (tran dai's conflicted copy 2013 04-02)
Chap2 new (tran dai's conflicted copy 2013 04-02)
 
Chap2 new
Chap2 newChap2 new
Chap2 new
 
Baigiang - bai4. Bài Toán Và Thuật Toán
Baigiang - bai4. Bài Toán Và Thuật ToánBaigiang - bai4. Bài Toán Và Thuật Toán
Baigiang - bai4. Bài Toán Và Thuật Toán
 
Bài tập CTDL và GT 1
Bài tập CTDL và GT 1Bài tập CTDL và GT 1
Bài tập CTDL và GT 1
 

C2 sap xep

  • 1. CHƯƠNG 2: SẮP XẾP (SORTING) Giáo viên: PHẠM TUẤN HIỆPCTDL&GT
  • 2. Nội dung  Tổng quan  Các phương pháp sắp xếp thông dụng Chương 2: Sắp xếp 2
  • 3. Tổng quan  Tại sao phải sắp xếp?  Để có thể sử dụng thuật toán tìm nhị phân  Để thực hiện thao tác nào đó được nhanh hơn  Định nghĩa bài toán sắp xếp  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 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 Chương 2: Sắp xếp
  • 4.  Khái niệm nghịch thế:  Xét một mảng các số a[0], a[1], … a[n-1]  Nếu có i<j và a[i] > a[j], thì ta gọi đó là một nghịch thế  Mảng chưa sắp xếp sẽ có nghịch thế  Mảng đã có thứ tự sẽ không chứa nghịch thế a[0] a[1] … a[n -1] 4 Tổng quan Chương 2: Sắp xếp
  • 5. Các phương pháp sắp xếp thông dụng  Phương pháp Đổi chỗ trực tiếp (Interchange sort)  Phương pháp Nổi bọt (Bubble sort)  Phương pháp Chèn trực tiếp (Insertion sort)  Phương pháp Chọn trực tiếp (Selection sort)  Phương pháp dựa trên phân hoạch (Quick sort) 5 Chương 2: Sắp xếp
  • 6. Interchange Sort – Ý tưởng  Nhận xét:  Để sắp xếp một dãy số, ta có thể xét các nghịch thế có trong dãy và làm triệt tiêu dần chúng đi  Ý 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ỗ 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 6 Chương 2: Sắp xếp
  • 7. Interchange Sort – Ví dụ 2 8 5 1 6 4 1512 1 2 3 4 5 6 70 i j 1 Nếu a[i] > a[j] thì đổi chỗ a[i], a[j] 7 Chương 2: Sắp xếp
  • 8. 12 8 5 2 6 4 151 1 2 3 4 5 6 70 i j 2 Nếu a[i] > a[j] thì đổi chỗ a[i], a[j] Interchange Sort – Ví dụ 8 Chương 2: Sắp xếp
  • 9. Interchange Sort – Ví dụ 2 12 8 5 6 4 151 1 2 3 4 5 6 70 i j 4 Nếu a[i] > a[j] thì đổi chỗ a[i], a[j] 9 Chương 2: Sắp xếp
  • 10. Interchange Sort – Ví dụ 2 4 12 8 6 5 151 1 2 3 4 5 6 70 i j 5 Nếu a[i] > a[j] thì đổi chỗ a[i], a[j] 10 Chương 2: Sắp xếp
  • 11. Interchange Sort – Ví dụ 2 4 5 6 8 12 151 1 2 3 4 5 6 70 Nếu a[i] > a[j] thì đổi chỗ a[i], a[j] 11 Chương 2: Sắp xếp
  • 12. Interchange Sort – Thuật toán // input: dãy (a, n) // output: dãy (a, n) đã được sắp xếp  Bước 1: i = 0; // bắt đầu từ đầu dãy  Bước 2: j = i+1;  Bước 3: Trong khi j < n thực hiện:  Nếu a[i]>a[j] thì đổi chỗ 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 12 Chương 2: Sắp xếp
  • 13. Interchange Sort - Cài đặt void InterchangeSort(int a[], int n) { for (int i=0 ; i<n-1 ; i++) for (int j=i+1; j<n ; j++) if(a[j]<a[i]) //nếu có nghịch thế thì đổi chỗ HoanVi(a[i], a[j]); } void HoanVi(int &a, int &b) { int temp = a; a = b; b = temp; } 13 Chương 2: Sắp xếp
  • 14. Các phương pháp sắp xếp thông dụng  Phương pháp Đổi chỗ trực tiếp (Interchange sort)  Phương pháp Nổi bọt (Bubble sort)  Phương pháp Chèn trực tiếp (Insertion sort)  Phương pháp Chọn trực tiếp (Selection sort)  Phương pháp dựa trên phân hoạch (Quick sort) 14 Chương 2: Sắp xếp
  • 15. 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í đầu dãy hiện hành, sau đó sẽ không xét đến nó ở bước tiếp theo  Ở lần xử lý thứ i 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 15 Chương 2: Sắp xếp
  • 16. Bubble Sort – Ví dụ 2 8 5 1 6 4 1512 1 2 3 4 5 6 70 i j 1 Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1] 16 Chương 2: Sắp xếp
  • 17. Bubble Sort – Ví dụ 12 2 8 5 4 6 151 1 2 3 4 5 6 70 i j 2 Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1] 17 Chương 2: Sắp xếp
  • 18. Bubble Sort – Ví dụ 2 12 4 8 5 6 151 1 2 3 4 5 6 70 i j 4 Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1] 18 Chương 2: Sắp xếp
  • 19. Bubble Sort – Ví dụ 2 4 12 8 5 6 151 1 2 3 4 5 6 70 i j 5 Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1] 19 Chương 2: Sắp xếp
  • 20. Bubble Sort – Ví dụ 2 4 5 12 8 6 151 1 2 3 4 5 6 70 i j 6 Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1] 20 Chương 2: Sắp xếp
  • 21. Bubble Sort – Ví dụ 2 4 5 6 12 8 151 1 2 3 4 5 6 70 i j 8 Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1] 21 Chương 2: Sắp xếp
  • 22. Bubble Sort – Ví dụ 2 4 5 6 8 12 151 1 2 3 4 5 6 70 i j 1512 Nếu a[j]<a[j-1] thì đổi chỗ a[j], a[j-1] 22 Chương 2: Sắp xếp
  • 23. Bubble Sort – Thuật toán // input: dãy (a, n) // output: dãy (a, n) đã được sắp xếp  Bước 1: i = 0;  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] thì đổi chỗ 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: Dừng // Hết dãy  Ngược lại: Lặp lại Bước 2 23 Chương 2: Sắp xếp
  • 24. Bubble Sort - Cài đặt void BubbleSort(int a[], int n) { for (int i=0; i<n-1; i++) for (int j=n-1; j>i; j--) if(a[j] < a[j-1]) HoanVi(a[j], a[j-1]); } 24 Chương 2: Sắp xếp
  • 25. Các phương pháp sắp xếp thông dụng  Phương pháp Đổi chỗ trực tiếp (Interchange sort)  Phương pháp Nổi bọt (Bubble sort)  Phương pháp Chèn trực tiếp (Insertion sort)  Phương pháp Chọn trực tiếp (Selection sort)  Phương pháp dựa trên phân hoạch (Quick sort) 25 Chương 2: Sắp xếp
  • 26. Insertion Sort – Ý tưởng  Nhận xét:  Mọi dãy a[0] , a[1] ,..., a[n-1] luôn có i-1 phần tử đầu tiên a[0] , a[1] ,... , a[i-2] đã có thứ tự (i ≥ 2)  Ý tưởng chính:  Tìm cách chèn phần tử a[i] vào vị trí thích hợp của đoạn đã được sắp để có dãy mới a[0] , a[1] ,... , a[i-1] trở nên có thứ tự  Vị trí này chính là pos thỏa : a[pos-1] a[i ]< a[pos] (1 pos i) 26 Chương 2: Sắp xếp
  • 27. Insertion Sort – Ý tưởng Chi tiết hơn:  Dãy ban đầu a[0] , a[1] ,..., a[n-1], xem như đã có đoạn gồm một phần tử a[0] đã được sắp  Thêm a[1] vào đoạn a[0] sẽ có đoạn a[0] a[1] được sắp  Thêm a[2] vào đoạn a[0] a[1] để có đoạn a[0] a[1] a[2] được sắp  Tiếp tục cho đến khi thêm xong a[n-1] vào đoạn a[0] a[1] ...a[n-1] sẽ có dãy a[0] a[1]….... A[n-1] được sắp 27 Chương 2: Sắp xếp
  • 28. Insertion Sort – Ví dụ 2 8 5 1 6 4 1512 1 2 3 4 5 6 70 28 Chương 2: Sắp xếp
  • 29. Insertion Sort – Ví dụ 2 8 5 1 6 4 1512 i x 1 2 3 4 5 6 70 pos 2 Chèn a[1] vào (a[0], a[1]) 29 Chương 2: Sắp xếp
  • 30. Insertion Sort – Ví dụ 12 8 5 1 6 4 152 i x 1 2 3 4 5 6 70 pos Chèn a[2] vào (a[0] … a[2]) 8 30 Chương 2: Sắp xếp
  • 31. Insertion Sort – Ví dụ 8 12 5 1 6 4 152 i x 1 2 3 4 5 6 70 pos Chèn a[3] vào (a[0] … a[3]) 5 31 Chương 2: Sắp xếp
  • 32. Insertion Sort – Ví dụ 5 8 12 1 6 4 152 i x 1 2 3 4 5 6 70 pos Chèn a[4] vào (a[0] … a[4]) 1 32 Chương 2: Sắp xếp
  • 33. Insertion Sort – Ví dụ 2 5 8 12 6 4 151 i x 1 2 3 4 5 6 70 pos Chèn a[5] vào (a[0]… a[5]) 6 33 Chương 2: Sắp xếp
  • 34. Insertion Sort – Ví dụ 2 5 6 8 12 4 151 i x 1 2 3 4 5 6 70 pos Chèn a[6] vào (a[0] … a[6]) 4 34 Chương 2: Sắp xếp
  • 35. Insertion Sort – Ví dụ 2 4 5 6 8 12 151 i x 1 2 3 4 5 6 70 pos Chèn a[7] vào (a[0] … a[7]) 15 35 Chương 2: Sắp xếp
  • 36. Insertion Sort – Ví dụ 2 4 5 6 8 12 151 pos 1 2 3 4 5 6 70 36 Chương 2: Sắp xếp
  • 37. Insertion Sort – Thuật toán // input: dãy (a, n) // output: dãy (a, n) đã được sắp xếp  Bước 1: i = 1; // giả sử có đoạn a[0] đã được sắp  Bước 2: x = a[i]; //Tìm vị trí pos thích hợp trong đoạn a[0] //đến a[i] để chèn x 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 x  Bước 4: a[pos] = x; // có đoạn a[0]..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 37 Chương 2: Sắp xếp
  • 38. Insertion Sort – Cài đặt void InsertionSort(int a[], int n){ int pos, x; for(int i=1; i<n; i++) //đoạn a[0] đã sắp { x = a[i]; pos = i; while(pos>0 && x<a[pos-1]) { a[pos] = a[pos-1]; // dời chỗ pos--; } a[pos] = x; } } 38 Chương 2: Sắp xếp
  • 39. Các phương pháp sắp xếp thông dụng  Phương pháp Đổi chỗ trực tiếp (Interchange sort)  Phương pháp Nổi bọt (Bubble sort)  Phương pháp Chèn trực tiếp (Insertion sort)  Phương pháp Chọn trực tiếp (Selection sort)  Phương pháp dựa trên phân hoạch (Quick sort) 39 Chương 2: Sắp xếp
  • 40. Selection Sort – Ý tưởng  Ý tưởng: mô phỏng một trong những cách sắp xếp tự nhiên nhất trong thực tế:  Chọn phần tử nhỏ nhất trong n phần tử ban đầu, đưa phần tử này về vị trí đúng là đầ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 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ử 40 Chương 2: Sắp xếp
  • 41. Selection Sort – Ví dụ 2 8 5 1 6 4 1512 i min 1 2 3 4 5 6 70 Find MinPos(0, 7) Swap(a[i], a[min]) 41 Chương 2: Sắp xếp
  • 42. Selection Sort – Ví dụ 2 8 5 12 6 4 151 i min 1 2 3 4 5 6 70 Find MinPos(1, 7) Swap(a[i], a[min]) 42 Chương 2: Sắp xếp
  • 43. Selection Sort – Ví dụ 2 8 5 12 6 4 151 i min 1 2 3 4 5 6 70 Find MinPos(2, 7) Swap(a[i], a[min]) 43 Chương 2: Sắp xếp
  • 44. Selection Sort – Ví dụ 2 4 5 12 6 8 151 i min 1 2 3 4 5 6 70 Find MinPos(3, 7) Swap(a[i], a[min]) 44 Chương 2: Sắp xếp
  • 45. Selection Sort – Ví dụ 2 4 5 12 6 8 151 i min 1 2 3 4 5 6 70 Find MinPos(4, 7) Swap(a[i], a[min]) 45 Chương 2: Sắp xếp
  • 46. Selection Sort – Ví dụ 2 4 5 6 12 8 151 i min 1 2 3 4 5 6 70 Find MinPos(5, 7) Swap(a[i], a[min]) 46 Chương 2: Sắp xếp
  • 47. Selection Sort – Ví dụ 2 4 5 6 8 12 151 i min 1 2 3 4 5 6 70 Find MinPos(6, 7) Swap(a[i], a[min]) 12 15 47
  • 48. Selection Sort – Thuật toán // input: dãy (a, n) // output: dãy (a, n) đã được sắp xế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-1]  Bước 3 : Nếu min i: Đổi chỗ a[min] và a[i]  Bước 4 : Nếu i < n:  i =i+1  Lặp lại Bước 2 Ngược lại: Dừng. //n phần tử đã nằm đúng vị trí 48
  • 49. Selection Sort – Cài đặt void SelectionSort(int a[], int n) { int min; // chỉ số phần tử nhỏ nhất trong dãy hiện hành for (int i=0; i<n-1; i++) { min = i; for(int j = i+1; j<n; j++) if (a[j] < a[min]) min = j; // ghi nhận vị trí phần tử nhỏ nhất if (min != i) HoanVi(a[min], a[i]); } } 49
  • 50. Các phương pháp sắp xếp thông dụng  Phương pháp Đổi chỗ trực tiếp (Interchange sort)  Phương pháp Nổi bọt (Bubble sort)  Phương pháp Chèn trực tiếp (Insertion sort)  Phương pháp Chọn trực tiếp (Selection sort)  Phương pháp dựa trên phân hoạch (Quick sort) 50 Chương 2: Sắp xếp
  • 51. Quick Sort – Ý tưởng  Ý tưởng:  Chia dãy cần sắp thành 2 phần  ½ dãy bên trái chứa các giá trị nhỏ hơn ½ dãy bên phải  Thực hiện việc sắp xếp trên từng dãy con 51 Chương 2: Sắp xếp
  • 52. Quick Sort – Ví dụ 2 8 5 1 6 4 1512 1 2 3 4 5 6 70 left right 5X STOP Khi >= x i j STOP Khi <= x Phân hoạch dãy 52
  • 53. Quick Sort – Ví dụ 2 8 5 1 6 12 154 1 2 3 4 5 6 70 left right 5X STOP Khi >= x i j STOP Khi<= x Phân hoạch dãy 53 Chương 2: Sắp xếp
  • 54. Quick Sort – Ví dụ 2 1 5 8 6 12 154 1 2 3 4 5 6 70 left right ij 54 Chương 2: Sắp xếp
  • 55. Quick Sort – Ví dụ 6X 2 4 5 8 6 12 151 1 2 3 4 5 6 70 left right i j STOP Khi >= x STOP Khi <= x Sắp xếp đoạn 3 Phân hoạch dãy 55 Chương 2: Sắp xếp
  • 56. Quick Sort – Ví dụ 2 4 5 6 8 12 151 1 2 3 4 5 6 70 left right ij Sắp xếp đoạn 3 56 Chương 2: Sắp xếp
  • 57. Quick Sort – Ví dụ 2 4 5 6 8 12 151 1 2 3 4 5 6 70 57 Chương 2: Sắp xếp
  • 58. Quick Sort – Phân hoạch dãy // input: dãy (a, n) // output: dãy con chia thành 2 đoạn: đoạn 1 ≤ x ≤ đoạn 2  Bước 1: Chọn tùy ý một phần tử x trong dãy giá trị mốc: x = a[(left+right)/2];  Bước 2: Duyệt từ 2 đầu dãy để phát hiện và hiệu chỉnh cặp phần tử a[i], a[j] vi phạm điều kiện  Bước 2.1: i = left; j = right;  Bước 2.2: Trong khi (a[i]<x) i++;  Bước 2.3: Trong khi (a[j]>x) j--;  Bước 2.4: Nếu i<= j  Hoán vị (a[i], a[j]); i++; j--;  Bước 2.5: Nếu i < j: Lặp lại Bước 2.2 //chưa xét hết mảng //Hết duyệt 58 Chương 2: Sắp xếp
  • 59. Quick Sort – Cài đặt void QuickSort(int a[], int left, int right) { int i, j, x; if (left right) return; x = a[(left+right)/2]; // chọn phần tử giữa làm giá trị mốc i = left; j = right; do{ while(a[i] < x) i++; while(a[j] > x) j--; if(i <= j) { HoanVi(a[i], a[j]); i++ ; j--; } } while(i < j); if(left<j) QuickSort(a, left, j); if(i<right) QuickSort(a, i, right); } 59