ĐẠI HỌC QUỐC GIA TPHCM
TRƯỜNG ĐẠI HỌC
CÔNG NGHỆ THÔNG TIN
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
CHƯƠNG II
TÌM KIẾM VÀ SẮP XẾP
Nguyễn Trọng Chỉnh
1
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
PHƯƠNG PHÁP MERGE SORT
PHƯƠNG PHÁP RADIX SORT (Sinh viên tự đọc)
2
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
* Ý tưởng:(Quick sort - sắp xếp dựa trên phân hoạch)
Giả sử dãy A có n phần tử có thứ tự tăng dần.
- Phần tử chốt (pivot) ak, k = 0,..,n-1 có giá trị khóa
không nhỏ hơn các phần tử của dãy đã có thứ tự
a0,..,ak-1 và có giá trị khóa không lớn hơn các phần tử
của dãy đã có thứ tự ak+1,..an-1.
- Để sắp xếp, chọn một phần tử ak bất kỳ trong A, chia
dãy A thành hai dãy a0,..,ak-1 có giá trị không lớn hơn
ak và dãy ak+1,..,an-1 có giá trị không nhỏ hơn, sắp xếp
hai dãy này theo cách như trên.
3
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
* Giải thuật: Sử dụng giải thuật đệ quy như sau:
Đầu vào: dãy al,al+1,..,ar chưa có thứ tự.
Đầu ra: dãy al, al+1,..,ar có thứ tự tăng dần.
- B1: Nếu l < r thì k (l + r)/2, x ak, i l, j r; ngược lại
qua B6.
- B2: Nếu ai > x, qua B3; ngược lại i i+1, qua B2.
- B3: Nếu aj < x, qua B4; ngược lại j j - 1, qua B3.
- B4: Nếu i < j thì hoán đổi ai và aj.
- B5: Thực hiện Quick Sort cho dãy al, al+1,..,ar=j và al=i, ai+1,..,ar
- B6: Kết thúc.
4
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
* Cài đặt:
void QuickSort(int *a, int l, int r) {
int i, j, x;
if (l >= r) return;
x = a[(l+r)/2]; i = l; j = r;
while(i < j) {
while (a[i] < x) i++; while (a[j] > x) j--;
if (i <= j) {hoandoi(a[i], a[j]); i++; j--; }
}
QuickSort(a, l, j); QuickSort(a, i, r);
}
5
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
l=0
Tìm i
7
x=1
5
8
i=0
l=0
Tìm j
7
7
i=0
4
2
6
5
8
1
4
2
6
8
1
3
j=7
r=7
x=1
5
3
j=7
r=7
x=1
i=0
l=0
Tìm j
1
r=7
4
2
6
j=6
3
6
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
l=0
Tìm j
7
x=1
5
8
i=0
l=0
Tìm j
7
7
i=0
4
2
6
3
j=5
x=1
5
8
1
r=7
4
2
6
3
j=4
i=0
l=0
Tim j
1
r=7
x=1
5
8
1
j=3
r=7
4
2
6
3
7
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
l=0
Tìm i
1
x=1
5
8
i=1
j=2
l=0
Tìm j
1
1
4
2
6
x=1
5
8
i=1
j=2
l=0
Tìm j
7
r=7
7
r=7
4
2
6
x=1
5
i = 1, j = 1
8
7
3
3
r=7
4
2
6
3
8
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
chia dãy
con
l=0
r=0
l=1
1
5
x=1
8
7
r=7
4
2
6
3
i=1
j=0
l=0
r=0
Xếp dãy trái
Xếp dãy phải
Tìm i
1
l=1
5
i=1
x=4
8
7
4
r=7
2
6
3
9
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
l=1
Tìm j
5
x=4
8
7
i=1
l=1
Tìm i
3
4
r=7
2
x=4
8
7
4
2
6
x=4
8
i=2
5
j=6
l=1
3
3
j=7
r=7
i=2
Tìm j
6
7
4
r=7
2
6
j=6
5
10
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
l=1
Tìm j
3
x=4
8
7
4
i=2
3
3
6
x=4
2
7
4
i=3
j=4
x=4
l=1
Tìm j
2
2
5
j=5
l=1
Tìm i
r=7
4
7
i=3
j=4
r=7
8
6
5
r=7
8
6
5
11
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
l=1
chia dãy
con
xếp dãy
trái
Tìm i
r=3
l=4
2
4
7
i=4
l=1
x=2
j=3
r=3
3
2
4
l=1
x=2
r=3
3
2
4
3
i=1
r=7
8
6
5
j=3
12
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
Tìm j
l=1
x=2
r=3
3
2
4
i=1
l=1 x=2
Tìm j
3
2
j=3
r=3
4
i=1 j=2
l=1 l=2 r=3
r=1
chia dãy
con
2
3
j=1
i=2
4
13
GIẢI THUẬT SẮP XẾP
PHƯƠNG
PHÁP
QUICK
SORT
l=1
xếp dãy
trái
xếp dãy
phải
Tìm i
r=1
2
l=2
x=3
r=3
3
4
l=2
x=3
r=3
3
4
i=2
14
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
Tìm j
Tìm j
l=2
x=3
r=3
3
4
i=2
j=3
l=2
x=3
r=3
3
4
i=2
j=3
15
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
chia dãy
con
j=1
Xếp dãy
phải
Xếp dãy
phải
l=2
r=3
3
4
i=3
l=3
r=3
4
l=4
x=8
7
8
r=7
6
5
16
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
Tìm i
l=4
x=8
7
8
r=7
6
i=4
l=4 x=8
Tìm i
Tìm j
7
8
l=4
i=5
x=8
7
8
i=5
5
j=7
r=7
6
5
j=7
r=7
6
5
j=7
17
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
Tìm i
l=4
x=8
7
5
r=7
6
8
i=6
j=6
Tìm i
l=4
x=8
7
5
r=7
6
8
j=6 i=7
Tìm j
l=4
x=8
7
5
r=7
6
8
j=6 i=7
18
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORTl = 7
l=4
Chia dãy
con
7
r=6
5
6
r=7
8
j=6 i=7
l=4
Xếp dãy
trái
7
l=4
Tìm i
7
i=4
x=5 r=6
5
6
x=5 r=6
5
6
19
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
l=4
Tìm i
7
x=5 r=6
5
6
i=4
l=4
Tìm j
7
i=4
l=4
Tìm j
x=5 r=6
5
6
j=6
x=5 r=6
7
5
i=4
j=5
6
20
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
Chia dãy
con
l=4
r=4
l=5
r=6
5
7
6
j=4
i=5
l=4
r=4
Xếp dãy
trái
Xếp dãy
phải
5
l=5
x=7
r=6
7
6
i=5
21
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
Tìm i
l=5
x=7
r=6
7
6
i=5
l=5
r=6
x=7
Tìm j
7
6
i=5 j=6
l=5 l=6
r=5 r=6
Chia dãy
con
6
7
22
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
l=5
r=5
Xếp dãy
trái
6
l=6
r=6
Xếp dãy
phải
7
l=7
r=7
Xếp dãy
phải
8
23
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
* Đánh giá: Theo phép so sánh
- Trường hợp tốt nhất: O(nlogn)
- Trường hợp trung bình:O(nlogn)
- Trường hợp xấu nhất: O(n2)
24
GIẢI THUẬT SẮP XẾP
PHƯƠNG PHÁP QUICK SORT
* Nhận xét:
- Việc lựa chọn phần tử chốt ảnh hưởng đến chí phí thực
hiện thuật toán. Phần tử chốt tốt nhất nếu nó là phần tử
trung vị (median) của dãy và xấu nhất nếu nó là phần tử
lớn nhất hoặc nhỏ nhất của dãy. Phần tử trung vị là
phần tử có giá trị lớn một nửa số phần tử của dãy chứa
nó.
- Để hạn chế khả năng xảy ra trường hợp xấu nhất, có thể
chọn tùy ý 3 hoặc 5 giá trị, sau đó chọn median của các
giá trị này.
25