CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Data Structures & Algorithms SẮP XẾP TT Nội dung 1.. Heap Sort 3 Quick Sort... Quick Sort-Ý tưởng Sau khi thực hiện phân hoạch, dãy ban đầu được phân
Trang 1CẤU TRÚC DỮ LIỆU VÀ GIẢI
THUẬT
Data Structures & Algorithms
SẮP XẾP (TT)
Nội dung
1 QuickSort
2 Merge Sort
3 Heap Sort
3
Quick Sort
Trang 2Giải thuật QuickSort sắp xếp dãy a 1 , a 2 ., a N 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
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
Quick Sort – Ý tưởng
• Đ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
• Đ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
• 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
Quick Sort – Ý tưởng
• 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):
• 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 Swap(a[i],a[j]);
• Bước 3 : Nếu i < j: Lặp lại Bước 2
Ngược lại: Dừng
Quick Sort – Ý tưởng
Trang 3Quick Sort – Ý tưởng
• Cho dãy số a:
Phân hoạch đoạn l =0, r = 7: x = a[3] = 5
Quick Sort – Ví dụ
j = 6
i = 0
i = 1
j = 5
i = 2
j = 4
j = 3
Quick Sort – Ví dụ
i = 0 j = 2
Quick Sort – Ví Dụ
• Phân hoạch đoạn l = 0, r = 2:
Quick Sort – Ví dụ
• Phân hoạch đoạn l =4, r = 7:
r =7
l = 4
15
i = 4
i = 4 j = 6 j = 6 j = 7
Quick Sort – Ví dụ
Quick Sort – Ví Dụ
• Phân hoạch đoạn l =6, r = 7:
Quick Sort – Ví dụ
Trang 4Quick Sort – Giải thuật Partition – Phân hoạch
Quick Sort – Ví dụ
12
0
5
X
5
4
0
5
X
Quick Sort – Ví dụ
Trang 525
Quick Sort – Ví dụ
4
0
i
j
26
Quick Sort – Ví dụ
4
0
left right
X
2
27
Quick Sort – Ví dụ
1
0
left right
X
6
28
Quick Sort – Ví dụ
1
0
left right
i
j
Quick Sort – Ví dụ
1
0
left right
12
Quick Sort – Ví dụ
1
0
Trang 631
Quick Sort – Đánh giá
32
Quick Sort – Độ phức tạp
33
Quick Sort – Nhận xét
34
Quick Sort – Bài Tập
Cho biết kết quả từng bước khi sắp xếp dãy sau tăng dần bằng thuật toán quick Sort
M={3,5,33,1,8,12,4,23,8}
Quick Sort – Bài Tập
M={3,5,33,1,8,12,4,23,8}
Quick Sort – Cách khác
Trang 737
Quick Sort – Cách khác
38
Quick Sort – Cách khác
39
Merge Sort – Trộn
40
Merge Sort – Trộn
Tư tưởng trộn:
• Có 2 mảng đã được sắp xếp chiều dài a,b
• Tạo ra 1 mảng chung được sắp xếp
3
a
b
Merge Sort – Trộn Ý Tưởng
Bước 1: chọn min của 2 phần tử đầu dãy chép qua
mảng kết quả
Bước 2: hủy phần tử min
Bước 3: nếu chưa đến cuối mảng trở về bước 1
Nếu đến cuối mảng: chép phần còn lại của mảng
kia vào mảng kết quả
Merge Sort – Trộn
i=0
j=0
Trang 843
Merge Sort – Trộn
3 i=0
1
j=1
2
1
44
Merge Sort – Trộn
3 i=1
1
j=1
1
2
45
Merge Sort – Trộn
i=1
1
j=2
1
2
3
46
Merge Sort – Trộn
i=1
1
j=3
1
2
3 4
Thực hiện lần lượt
Merge Sort – Trộn
14
20 J=5
1
j=7 i=8
5 7 8 9 10 13
4 6 11
1
2
3
Merge Sort – Trộn
20 J=5
1
i=8
20 j=6
Chép phần còn lại của mảng 2
Trang 949
Merge Sort – Trộn
Ví dụ khác ta có a=(1,3,7,9), b=(2,6),
quá trình hòa nhập diễn ra như sau:
Danh sách a Danh sách b So sánh Danh sách c
1,3,7,9 2,6 1<2 1
3,7,9 2,6 2<3 1,2
3,7,9 6 3<6 1,2,3
7,9 6 6<7 1,2,3,6
50
Merge Sort – Trộn
51
Merge Sort – Viết hàm
52
Merge Sort – Trộn
Trang 1055
Merge Sort – Trộn
56
Merge Sort – Trộn
57
Merge Sort – Trộn
58
Merge Sort – Trộn
Merge Sort – Trộn
Trang 1161
Merge Sort – Ý tưởng
62
Merge Sort – Ý tưởng
63
Merge Sort – Trộn
void MergeSort(int []M,int left,int right)
{
if (left >= right) return;
int mid = (left + right) / 2;
MergeSort(M, left, mid);
MergeSort(M, mid + 1, right);
Merge(M, left, mid, right);
}
64
Merge Sort – Trộn
void Merge(int []M,int left,int mid,int right) {
int[] Temp = new int[right - left + 1];
int pos = 0;
int i = left;
int j = mid + 1;
while(!(i>mid && j>right)) {
if((i<=mid && j <=right && M[i]<M[j]) || j>right) Temp[pos++] = M[i++];
else Temp[pos++] = M[j++];
} for(i=0;i<Temp.Length;i++) M[left + i] = Temp[i];
}
Trang 1267
Heap Sort
68
Định nghĩa Heap
69
Heap Sort
70
Heap Sort
Trang 1373
Heap Sort – Ý tưởng
74
Heap Sort – Ý tưởng
75
Thêm một nút vào Heap
76
Thêm một nút vào Heap
Trang 1479
Xóa nút gốc từ Heap
80
Xóa nút gốc từ Heap
81
Xóa nút gốc từ Heap
82
Heap Sort
Trang 1585
Heap Sort -Ví dụ minh họa – Tạo Heap
86
Heap Sort -Ví dụ minh họa – Sắp xếp từ Heap
87
Heap Sort -Ví dụ minh họa – Sắp xếp từ Heap
88
Heap Sort -Ví dụ minh họa – Sắp xếp từ Heap
Trang 1691
Heap Sort – Cài đặt
92
Heap Sort – Nhận xét
93
• Slide được tham khảo từ:
• Slide CTDL GT, Khoa Khoa Học Máy Tính, ĐHCNTT
• Slide CTDL GT, Thầy Nguyễn Tấn Trần Minh Khang, ĐH CNTT
• Slid CTDL GT, Cô Trần Thị Thương, ĐH CNTT
• Congdongcviet.com
• Cplusplus.com
Slide được tham khảo từ
94