ACM Computing Surveys, Vol.. " ...The bibliography appearing at the end of this article lists 37 sorting algorithms and 100 books and papers on sorting published in the last 20 years...
Trang 1NGUY N C NGH A
B môn KHMT - HBKHN
Ch ng 5
S p x p (Sorting)
William A Martin, Sorting ACM Computing Surveys, Vol 3, Nr 4, Dec 1971, pp 147-174.
" The bibliography appearing at the end of this article lists 37 sorting algorithms
and 100 books and papers on sorting published in the last 20 years
Suggestions are made for choosing the algorithm best suited to a given situation."
D Knuth: 40% th i gian ho t đ ng c a các máy tính là dành cho s p x p!
N I DUNG
5.1 Bài toán s p x p
5.2 Ba thu t toán s p x p c b n
5.3 S p x p tr n (Merge Sort)
5.4 S p x p nhanh (Quick Sort)
5.5 S p x p vun đ ng (Heap Sort)
5.6 C n d i cho đ ph c t p tính toán c a bài toán s p x p 5.7 Các ph ng pháp s p x p đ c bi t
2
NGUY N C NGH A
B môn KHMT - HBKHN
Trang 2– Ta c n s p x p các b n ghi theo th t c a các khoá
4
NGUY N C NGH A
B môn KHMT - HBKHN
Trang 35.1.1 Bài toán s p x p
• Chú ý:
• Vi c s p x p ti n hành tr c ti p trên b n ghi đòi h i di chuy n
v trí b n ghi, có th là thao tác r t t n kém
• Vì v y, ng i ta th ng xây d ng b ng khoá g m các b n ghi
ch có hai tr ng là (khoá, con tr )
– tr ng "khoá" ch a giá tr khoá,
– tr ng "con tr " đ ghi đ a ch c a b n ghi t ng ng
• Vi c s p x p theo khoá trên b ng khoá không làm thay đ i
b ng chính, nh ng trình t các b n ghi trong b ng khoá cho phép xác đ nh trình t các b n ghi trong b ng chính
– Khoa h c và k thu t (Science and engineering);
– Các thu t toán l p l ch (Scheduling algorithms),
• ví d thi t k ch ng trình d ch, truy n thông, (compiler design, telecommunication);
– Máy tìm ki m web (Web search engine);
– và nhi u ng d ng khác…
NGUY N C NGH A
B môn KHMT - HBKHN
Trang 45.1.1 Bài toán s p x p
• Các lo i thu t toán s p x p
– S p x p trong (internal sort)
• òi h i h d li u đ c đ a toàn b vào b nh trong c a máy tính – S p x p ngoài (external sort)
• H d li u không th cùng lúc đ a toàn b vào b nh trong,
nh ng có th đ c vào t ng b ph n t b nh ngoài
• Các đ c tr ng c a m t thu t toán s p x p:
– T i ch (in place): n u không gian nh ph mà thu t toán đòi h i là
O(1), ngh a là b ch n b i h ng s không ph thu c vào đ dài c a dãy
• Có hai phép toán c b n mà thu t toán s p x p th ng ph i s d ng:
– i ch (Swap): Th i gian th c hi n là O(1)
void swap( datatype &a, datatype &b){
datatype temp = a; //datatype-ki u d li u c a ph n t
Trang 5O(n log n)
Comparison lower bound:
(n log n)
Specialized algorithms:
O(n)
Handling huge data sets
…
Bucket sort Radix sort
External sorting
NGUY N C NGH A
B môn KHMT - HBKHN
Các thu t toán s p x p d a trên phép so sánh
Name Average Worst Memory Stable Method
Cocktail sort — O(n²) O(1) Yes Exchanging Comb sort O(n log n) O(n log n) O(1) No Exchanging
Selection sort O(n²) O(n²) O(1) No Selection
Insertion sort O(n + d) O(n²) O(1) Yes Insertion
Shell sort — O(n log² n) O(1) No Insertion
Binary tree sort O(n log n) O(n log n) O(n) Yes Insertion
Library sort O(n log n) O(n²) O(n) Yes Insertion
Merge sort O(n log n) O(n log n) O(n) Yes Merging
In-place merge sort O(n log n) O(n log n) O(1) Yes Merging
Heapsort O(n log n) O(n log n) O(1) No Selection
Smoothsort — O(n log n) O(1) No Selection
Quicksort O(n log n) O(n²) O(log n) No Partitioning Introsort O(n log n) O(n log n) O(log n) No Hybrid
Patience sorting — O(n²) O(n) No Insertion
10
NGUY N C NGH A
B môn KHMT - HBKHN
Trang 6Các thu t toán s p x p không d a trên phép so sánh
5.4 S p x p nhanh (Quick Sort)
5.5 S p x p vun đ ng (Heap Sort)
5.6 C n d i cho đ ph c t p tính toán c a bài toán s p x p 5.7 Các ph ng pháp s p x p đ c bi t
12
NGUY N C NGH A
B môn KHMT - HBKHN
Trang 9Don’t start coding
You must design a working algorithm first.
Trang 105.2.1 S p x p chèn (Insertion Sort)
• Thu t toán:
– T i b c k = 1, 2, , n, đ a ph n t th ktrong m ng đã cho vào đúng
v trí trong dãy g m kph n t đ u tiên.
=a[i]) trong dãy g m i ph n
Trang 12NGUY N C NGH A
B môn KHMT - HBKHN
23
Các đ c tính c a Insertion Sort
• S p x p chèn là t i ch và n đ nh (In place and Stable)
• Phân tích th i gian tính c a thu t toán
– Best Case: 0 hoán đ i, n-1 so sánh (khi dãy đ u vào là đã đ c s p)
– Worst Case: n2 /2 hoán đ i và so sánh (khi dãy đ u vào có th t
ng c l i v i th t c n s p x p)
– Average Case: n2 /4 hoán đ i và so sánh
• Thu t toán này có th i gian tính trong tình hu ng t t nh t là
printf("\nGive n = "); scanf("%i", &N);
//seed random number generator
Trang 13void selectionSort(int a[], int n){
int i, j, min, temp;
template <class Elem, class Comp>
void selection_sort(Elem A[], int n) {
for (int i=0; i<n-1; i++) {
int lowindex = i; // Remember its index
for (int j=n-1; j>i; j ) // Find least
26
NGUY N C NGH A
B môn KHMT - HBKHN
Trang 14nh ví d minh ho cho các giáo trình nh p môn l p trình.
• B t đ u t đ u dãy, thu t toán ti n hành so sánh m i ph n t v i
ph n t đi sau nó và th c hi n đ i ch , n u chúng không theo đúng
th t Quá trình này s đ c l p l i cho đ n khi g p l n duy t t
đ u dãy đ n cu i dãy mà không ph i th c hi n đ i ch (t c là t t c các ph n t đã đ ng đúng v trí) Cách làm này đã đ y ph n t l n
nh t xu ng cu i dãy, trong khi đó nh ng ph n t có giá tr nh h n
đ c d ch chuy n v đ u dãy.
• M c dù thu t toán này là đ n gi n, nh ng nó là thu t toán kém hi u
qu nh t trong ba thu t toán c b n trình bày trong m c này Vì th ngoài m c đích gi ng d y, S p x p n i b t r t ít khi đ c s d ng.
28
NGUY N C NGH A
B môn KHMT - HBKHN
Trang 17N I DUNG
5.1 Bài toán s p x p
5.2 Ba thu t toán s p x p c b n
5.3 S p x p tr n (Merge Sort)
5.4 S p x p nhanh (Quick Sort)
5.5 S p x p vun đ ng (Heap Sort)
5.6 C n d i cho đ ph c t p tính toán c a bài toán s p x p 5.7 Các ph ng pháp s p x p đ c bi t
Trang 18– S p x p m i dãy con m t cách đ qui s d ng s p x p tr n
– Khi dãy ch còn m t ph n t thì tr l i ph n t này
• T h p (Combine)
– Tr n (Merge) hai dãy con đ c s p x p đ thu đ c dãy đ c s p x p
g m t t c các ph n t c a c hai dãy con
if p < r Ki m tra đi u ki n neo
then q (p + r)/2 Chia (Divide)
36
NGUY N C NGH A
B môn KHMT - HBKHN
Trang 196321
Trang 206 1 3 5
4 9 2 8
Divide
4 9
3 4
2 8
1 2
6 1
7 8
3 5
3 4
8 2
1 2
6 1
7 8
5 3
5 6
Merge
6 5 3 1
9 8 4 2
Merge
9 8 6 5 4 3 2 1
K t qu :
NGUY N C NGH A
B môn KHMT - HBKHN
Trang 21Cài đ t merge: Tr n A[first mid] và A[mid+1 last]
void merge(DataType A[], int first, int mid, int last) {
DataType tempA[MAX_SIZE]; // m ng ph
int first1 = first; int last1 = mid;
int first2 = mid + 1; int last2 = last; int index = first1; for (; (first1 <= last1) && (first2 <= last2); ++index){
if (A[first1] < A[first2]) {
tempA[index] = A[first1]; ++first1;}
else
{ tempA[index] = A[first2]; ++first2;} }
for (; first1 <= last1; ++first1, ++index)
tempA[index] = A[first1]; // sao n t dãy con 1
for (; first2 <= last2; ++first2, ++index)
tempA[index] = A[first2]; // sao n t dãy con 2
for (index = first; index <= last; ++index)
A[index] = tempA[index]; // sao tr m ng k t qu
{ // chia thành hai dãy con
int mid = (first + last)/2; // ch s đi m gi a
// s p x p dãy con trái A[first mid]
mergesort(A, first, mid);
// s p x p dãy con ph i A[mid+1 last]
mergesort(A, mid+1, last);
// Tr n hai dãy con
merge(A, first, mid, last);
Trang 22N I DUNG
5.1 Bài toán s p x p
5.2 Ba thu t toán s p x p c b n
5.3 S p x p tr n (Merge Sort)
5.4 S p x p nhanh (Quick Sort)
5.5 S p x p vun đ ng (Heap Sort)
5.6 C n d i cho đ ph c t p tính toán c a bài toán s p x p 5.7 Các ph ng pháp s p x p đ c bi t
Trang 235.4.1 S đ Quick Sort
• Thu t toán s p x p nhanh đ c phát tri n b i
Hoare n m 1960 khi ông đang làm vi c cho
hãng máy tính nh Elliott Brothers Anh.
• Theo th ng kê tính toán, Quick sort (s vi t t t là
QS) là thu t toán s p x p nhanh nh t hi n nay.
• QS có th i gian tính trung bình là O(n log n), tuy
nhiênth i gian tính t i nh t c a nó l i là O(n2 ).
10 Algorithms in 20th Century
Science, Vol 287, No 5454, p 799, February 2000
Computing in Science & Engineering, January/February 2000
1946: The Metropolis Algorithm for Monte Carlo
1947: Simplex Method for Linear Programming // Tính toán khoa h c
1950: Krylov Subspace Iteration Method
1951: The Decompositional Approach to Matrix Computations
1957: The Fortran Optimizing Compiler
1959: QR Algorithm for Computing Eigenvalues
1962: Quicksort Algorithms for Sorting
1965: Fast Fourier Transform // X lý nh
1977: Integer Relation Detection
1987: Fast Multipole Method
có nh h ng sâu r ng đ n vi c phát tri n và ng d ng c a khoa
h c k thu t …
Trang 245.4.1 S đ Quick Sort
• Quick sort là thu t toán s p x p đ c phát tri n d a trên k thu t chia đ tr
• Thu t toán có th mô t đ qui nh sau (có d ng t ng t nh merge sort):
1 Neo đ qui (Base case) N u dãy ch còn không quá m t ph n t thì nó là dãy
đ c s p và tr l i ngay dãy này mà không ph i làm gì c
2 Chia(Divide):
• Ch n m t ph n t trong dãy và g i nó làph n t ch t p (pivot).
• Chia dãy đã cho ra thành hai dãy con: Dãy con trái (L) g m nh ng ph n t
không l n h n ph n t ch t, còn dãy con ph i (R) g m các ph n t không
nh h n ph n t ch t Thao tác này đ c g i là "Phân đo n" (Partition).
3 Tr (Conquer):L p l i m t cách đ qui thu t toán đ i v i hai dãy con L và R.
65
26
75 0
13
81 92
57 26
75 0
Trang 25S đ t ng quát c a QS
• S đ t ng quát c a QS có th mô t nh sau:
Quick-Sort(A, Left, Right)
1. if (Left < Right ) {
2 Pivot = Partition(A, Left, Right);
3. Quick-Sort(A, Left, Pivot –1);
4. Quick-Sort(A, Pivot +1, Right); }
• Hàm Partition(A, Left, Right ) th c hi n chia A[Left Right] thành hai
đo n A[Left Pivot –1 ] và A[Pivot+1 Right] sao cho:
• Các ph n t trong A[Left Pivot –1] là nh h n ho c b ng A[Pivot]
• Các ph n t trong A[Pivot+1 Right] là l n h n ho c b ng A[Pivot].
• L nh g i th c hi n thu t toán Quick-Sort(A, 1, n)
4 Pivot = Partition(A, Left, Right);
5. Quick-Sort(A, Left, Pivot –1);
6. Quick-Sort(A, Pivot +1, Right); }
50
NGUY N C NGH A
B môn KHMT - HBKHN
Trang 265.4.2 Thao tác chia
• Trong QS thao tác chia bao g m 2 công vi c:
– Ch n ph n t ch t p.
– Phânđo n: Chia dãy đã cho ra thành hai dãy con: Dãy con trái (L) g m
nh ng ph n t không l n h n ph n t ch t, còn dãy con ph i (R) g m
các ph n t không nh h n ph n t ch t.
• Thao tác phânđo n có th cài đ t (t i ch ) v i th i gian (n).
• Hi u qu c a thu t toán ph thu c r t nhi u vào vi c ph n t nào
đ ng gi a trong danh sách đ c s p x p (ta g i ph n t nh
v y là trung v /median) Khi đó, sau log2n l n phân đo n ta s
đ t t i danh sách v i kích th c b ng 1 Tuy nhiên, đi u đó r tkhó th c hi n Ng i ta th ng s d ng các cách ch n ph n t
Trang 27Thu t toán phân đo n
• Ta xây d ng hàm Partition(a, left, right) làm vi c sau:
• Input:M ng a[left right]
• Output: Phân b l i các ph n t c a m ng đ u vào và tr l i
ch s jpivot tho mãn:
– a[jpivot ] ch a giá tr ban đ u c a a[left],
– a[i] ≤ a[jpivot], v i m i left ≤ i < pivot,
– a[j] ≥ a[jpivot]), v i m i pivot < j ≤ right
53
NGUY N C NGH A
B môn KHMT - HBKHN
Ph n t ch t là ph n t đ ng đ u
Partition(a, left, right)
i = left; j = right + 1; pivot = a[left];
i Sau khi ch n pivot, d ch các con tr i và j t đ u và cu i m ng j
và đ i ch c p ph n t tho mãn a[i] > pivot và a[j] < pivot
pivot đ c ch n là
ph n t đ ng đ u
j là ch s (jpivot) c n tr l i,
do đó c n đ i ch a[left] và a[j]
Trang 28a pivot vào v trí
Trang 29Ph n t ch t là ph n t đ ng gi a
PartitionMid(a, left, right);
i = left; j = right; pivot = a[(left + right)/2];
repeat
while a[i] < pivot do i = i + 1;
while pivot < a[j] do j = j - 1;
• Cài đ t thu t toán phân đo n trong đó pivot đ c ch n là ph n t đ ng
gi a ( ây c ng là cách cài đ t mà TURBO C l a ch n).
58
NGUY N C NGH A
B môn KHMT - HBKHN
Trang 30Cài đ t QUICK SORT
int Partition(int a[], int left, int right) {
int i, j, pivot;
i = left; j = right + 1; pivot = a[left];
while (i < j) {
i = i + 1; while ((i <= right)&&(a[i] < pivot)) i++;
j ; while ((j >= left)&& (a[j] > pivot)) j ;
pivot = Partition(a, left, right);
if (left < pivot) quick_sort(a, left, pivot-1);
if (right > pivot) quick_sort(a, pivot+1, right);}
Cài đ t Quick Sort (d đ c h n?)
int Partition(int a[], int L, int R)
Trang 31Ch ng trình DEMO/* CHUONG TRINH DEMO QUICK SORT */
/* include: stdlib.h; stdio.h; conio.h; process.h; include time.h */
void quick_sort(int a[], int left, int right);
void swap(int &a, int &b);
int Partition(int a[], int left, int right);
int a[1000]; int n; // n - so luong phan tu cua day can sap xep
void main() {
int i; clrscr();
printf("\n Give n = "); scanf("%i",&n); randomize();
for (i = 0; i < n; i++) a[i] = rand(); // Tao day ngau nhien
printf("\nDay ban dau la: \n");
for (i = 0; i < n; i++) printf("%8i ", a[i]);
quick_sort(a, 0, n-1); // Thuc hien quick sort
printf("\n Day da duoc sap xep.\n");
for (i = 0; i < n; i++) printf("%8i ", a[i]);
T T
T n T q T n q O n O
Trang 32Th i gian tính c a Quick-Sort
• Th i gian tính c a Quick-Sort ph thu c vào vi c phép phân chia là
cân b ng (balanced) hay không cân b ng (unbalanced) , và đi u
đó l i ph thu c vào vi c ph n t nào đ c ch n làm ch t.
1 Phân đo n không cân b ng: th c s không có ph n nào c , do
đó m t bài toán con có kích th c n – 1 còn bài toán kia có kích
th c 0.
2 Phân đo n hoàn h o (Perfect partition): vi c phân đo n luôn
đ c th c hi n d i d ng phân đôi, nh v y m i bài toán con
có kích th c c n/2.
3 Phân đo n cân b ng: vi c phân đo n đ c th c hi n đâu đó
quanh đi m gi a, ngh a là m t bài toán con có kích th c n – k
còn bài toán kia có kích th c k.
T n
T
T T
(
1 ) 1 ( )
0
(
) 1 ( ) 2 ( )
1
T
) 2 ( ) 3 ( )
2
T
) 2 ( ) 1 ( )
n
T
2
) 1 ( )
(
) (n2O
Trang 33T n
T
T T
)
(
1 ) 1 ( )
Trang 34Phân tích tình hu ng t i nh t
Ta có công th c đ qui:
Ch ng minh: Qui n p theo n.
• Base case: Rõ ràng b đ đúng cho n=1
• Induction step: Gi s b đ đúng v i m i n < n’, ta ch ng minh
Trang 35Th i gian tính trung bình c a QS
QuickSort Average Case
• Gi s r ng pivot đ c ch n ng u nhiên trong s các
ph n t c a dãy đ u vào
• T t c các tình hu ng sau đây là đ ng kh n ng:
– Pivot là ph n t nh nh t trong dãy
– Pivot là ph n t nh nhì trong dãy
– Pivot là ph n t nh th ba trong dãy
…
– Pivot là ph n t l n nh t trong dãy
• i u đó c ng là đúng khi pivot luôn đ c ch n là ph n
t đ u tiên, v i gi thi t là dãy đ u vào là hoàn toàn
• Gi i công th c đ qui này ta thu đ c
E(T(N)) = O(N log N).
Trang 36N I DUNG
5.1 Bài toán s p x p
5.2 Ba thu t toán s p x p c b n
5.3 S p x p tr n (Merge Sort)
5.4 S p x p nhanh (Quick Sort)
5.5 S p x p vun đ ng (Heap Sort)
5.6 C n d i cho đ ph c t p tính toán c a bài toán s p x p 5.7 Các ph ng pháp s p x p đ c bi t
Trang 375.5.1 The Heap Data Structure
• nhngh a: ng (heap) là cây nh phân g n hoàn ch nh có hai
tínhch t sau:
– Tính c u trúc (Structural property): t t c các m c đ u là đ y, ngo i
tr m c cu i cùng, m c cu i đ c đi n t trái sang ph i.
– Tính cóth t hay tính ch t đ ng (heap property): v i m i nút x
7
8
4 2
– Con trái c a A[i] là A[2*i]
– Con ph i c a A[i] là A[2*i + 1]
– Cha c a A[i] là A[ i/2 ]
Trang 38Ví d đ ng16
14
1 4
Trang 39B sung và lo i b nút
Adding/Deleting Nodes
• Nút m i đ c b sung vào m c đáy (t trái sang ph i)
• Các nút đ c lo i b kh i m c đáy (t ph i sang trái)
Trang 40– Di chuy n xu ng theo cây
– Ti p t c quá trình cho đ n khi nút không còn bé h n con