Các giải thuật sắp xếp
Trang 1S P X P Ắ Ế
Nguy n Văn Linh ễ
Trang 3T m quan tr ng c a bài toán s p x p ầ ọ ủ ắ ế
S p x p m t danh sách các đ i t ắ ế ộ ố ượ ng theo m t ộ
th t nào đó là m t bài toán th ứ ự ộ ườ ng đ ượ c v n ậ
Trang 4S p x p trong và s p x p ngoài ắ ế ắ ế
S p x p trong ắ ế là s s p x p ự ắ ế d li u đ ữ ệ ượ c t ch c trong b nh ổ ứ ộ ớ
trong c a máy tính.ủ
Các đ i t ố ượ ng c n đ ầ ượ c s p x p là các m u tin g m m t ho c nhi u ắ ế ẩ ồ ộ ặ ề
tr ườ ng M t trong các tr ộ ườ ng đ ượ c g i là khóa (key), ki u c a nó là m t ọ ể ủ ộ
ki u có quan h th t (nh các ki u s nguyên, s th c, chu i ký t ) ể ệ ứ ự ư ể ố ố ự ỗ ự
Danh sách các đ i t ố ượ ng c n s p x p s là m t m ng c a các m u tin ầ ắ ế ẽ ộ ả ủ ẩ
v a nói trên ừ ở
M c đích c a vi c s p x p là t ch c l i các m u tin sao cho các khóa ụ ủ ệ ắ ế ổ ứ ạ ẩ
c a chúng đ ủ ượ c s p th t t ắ ứ ự ươ ng ng v i quy lu t s p x p ứ ớ ậ ắ ế
M t cách m c nhiên, quy lu t s p x p là th t không gi m Khi c n s p ộ ặ ậ ắ ế ứ ự ả ầ ắ
x p theo th t không tăng thì ph i nói rõ ế ứ ự ả
S p x p ngoài ắ ế là s s p x p đ ự ắ ế ượ c s d ng khi s l ử ụ ố ượ ng đ i t ố ượ ng c n ầ
s p x p l n không th l u tr trong b nh trong mà ph i l u tr trên ắ ế ớ ể ư ữ ộ ớ ả ư ữ b ộ
nh ngoài ớ
Trang 5T ch c d li u và ngôn ng cài đ t ổ ứ ữ ệ ữ ặ
const int n = 10;
typedef int keytype;
typedef float othertype;
typedef struct recordtype {
Trang 7Gi i thu t s p x p ch n (Selection Sort) ả ậ ắ ế ọ
v i a[i] ớ
Trang 8Ph ươ ng pháp ch n ph n t ọ ầ ử
(lowindex = i).
= j).
Trang 10i = i+1
a[j].key<lowkey
lowindex = j lowkey = a[j].key
S
Đ Đ
Trang 12O(n 2
1) -
n(n 1)
i - (n
2 - n
0
= i
=
=
= ∑
Trang 13Gi i thu t s p x p xen (Insertion ả ậ ắ ế
Sort)
t ự
Trang 14Ph ươ ng pháp xen
đó a[0],a[1], a[j-1]:
Trang 18 Vòng l p /*1*/ có i ch y t 1 đ n n-1 nên ta có: ặ ạ ừ ế
)
O(n 2
1) -
n(n i
1 i
=
=
= ∑
=
Trang 19Gi i thu t s p x p “n i b t” (Bubble ả ậ ắ ế ổ ọ
Sort)
th 2 ứ
…
Trang 21a[j].key < a[j-1].key
j>= i+1 Đ
j = j-1
S
Trang 22a[j].key < a[j-1].key
j>=
i+1 Đ
j = j-1
S
Trang 23Ý t ưở ng c a QuickSort ủ
Ch n m t giá tr khóa v làm ch t (pivot).ọ ộ ị ố
Phân ho ch dãy a[0] a[n-1] thành hai m ng con "bên trái" và ạ ả
"bên ph i" M ng con "bên trái" bao g m các ph n t có ả ả ồ ầ ử khóa
nh h n ch t ỏ ơ ố , m ng con "bên ph i" bao g m các ph n t có ả ả ồ ầ ử
khóa l n h n ho c b ng ch t ớ ơ ặ ằ ố
S p x p m ng con “bên trái” và m ng con “bên ph i”.ắ ế ả ả ả
Sau khi đã s p x p đắ ế ược m ng con “bên trái” và m ng con ả ả
“bên ph i” thì m ng đã cho s đả ả ẽ ược s p b i vì t t c các khóa ắ ở ấ ảtrong m ng con “bên trái” đ u nh h n các khóa trong m ng ả ề ỏ ơ ảcon “bên ph i”.ả
Vi c s p x p các m ng con “bên trái” và “bên ph i” cũng đệ ắ ế ả ả ược
ti n hành b ng phế ằ ương pháp nói trên
M t m ng ch g m m t ph n t ho c g m nhi u ph n t có ộ ả ỉ ồ ộ ầ ử ặ ồ ề ầ ửkhóa b ng nhau thì đã có th t ằ ứ ự
Trang 24Ph ươ ng pháp ch n ch t ọ ố
Trang 25Ph ươ ng pháp phân ho ch ạ
ch t ố
ch t ố
Trang 31Ví d v phân ho ch ụ ề ạ
Chỉ số 0 1 2 3 4 5 6 7 8 9 Khoá 5 4 2 10 5 12 8 1 15 8
L= 3
Ch t p = 8 ố
R= 8
Trang 32Ví d v phân ho ch ụ ề ạ
Chỉ số 0 1 2 3 4 5 6 7 8 9 Khoá 5 4 2 10 5 12 8 1 15 8
L= 3
Ch t p = 8 ố
R= 7
Trang 33Ví d v phân ho ch ụ ề ạ
Chỉ số 0 1 2 3 4 5 6 7 8 9 Khoá 5 4 2 1 5 12 8 10 15 8
L= 3
Ch t p = 8 ố
R= 7
Trang 34Ví d v phân ho ch ụ ề ạ
Chỉ số 0 1 2 3 4 5 6 7 8 9 Khoá 5 4 2 1 5 12 8 10 15 8
L= 4
Ch t p = 8 ố
R= 7
Trang 35Ví d v phân ho ch ụ ề ạ
Chỉ số 0 1 2 3 4 5 6 7 8 9 Khoá 5 4 2 1 5 12 8 10 15 8
L= 5
Ch t p = 8 ố
R= 7
Trang 36Ví d v phân ho ch ụ ề ạ
Chỉ số 0 1 2 3 4 5 6 7 8 9 Khoá 5 4 2 1 5 12 8 10 15 8
L= 5
Ch t p = 8 ố
R= 6
Trang 37Ví d v phân ho ch ụ ề ạ
Chỉ số 0 1 2 3 4 5 6 7 8 9 Khoá 5 4 2 1 5 12 8 10 15 8
L= 5
Ch t p = 8 ố
R= 5
Trang 38Ví d v phân ho ch ụ ề ạ
Chỉ số 0 1 2 3 4 5 6 7 8 9 Khoá 5 4 2 1 5 12 8 10 15 8
L= 5
Ch t p = 8 ố R= 4
5 6 7 8 9
12 8 10 15 8
Trang 45L u đ ư ồ
Begin
k = i+1 firstkey = a[i].key
(k<=j) and (a[k].key == firstkey
return i return k
i, j
S
Trang 46(k<=j) and (a[k].key == firstkey
return i return k
i, j
S
Trang 47 L nh WHILE là t n ệ ốnhi u th i gian nh t.ề ờ ấ
th c hi n là n-1 hay ự ệT(n) = O(n)
Trang 49Hàm Partition
int Partition(int i,int j, keytype pivot)
{ int L,R;
/*1*/ L = i;
/*2*/ R = j;
/*3*/ while (L <= R) {
/*4*/ while (a[L].key < pivot) L++;
/*5*/ while (a[R].key >= pivot) R ;
Trang 50/*4*/ while (a[L].key < pivot) L++;
/*5*/ while (a[R].key >= pivot) R ;
ph n t m ng, m i ph n t m t l n, m i l n ầ ử ả ỗ ầ ử ộ ầ ỗ ầ
Trang 52 Th i gian tìm ch t và phân ho ch m ng là O(n) = n.ờ ố ạ ả
Khi n = 1, th t c QuickSort ch làm m t nhi m v duy nh t là g i ủ ụ ỉ ộ ệ ụ ấ ọhàm Findpivot v i kích thớ ước b ng 1, hàm này t n th i gian O(1) =1 ằ ố ờ
Trong trường h p x u nh t, phân ho ch l ch.ợ ấ ấ ạ ệ
Khi đó ta có th thành l p phể ậ ương trình đ quy nh sau:ệ ư
n + T(1) +
1) - T(n
1
= n nêu
1
T(n)
Gi i PT này ta đả ược T(n) =O(n2)
Trang 53Đánh giá QuickSort
Trong tr ườ ng h p t t nh t khi ta ch n đ ợ ố ấ ọ ượ c
ch t sao cho hai m ng con có kích th ố ả ướ c
b ng nhau và b ng n/2 ằ ằ
Lúc đó ta có ph ươ ng trình đ quy nh sau: ệ ư
Gi i PT này ta đ ả ượ c T(n) =O(nlogn)
1 n
nêu
1
T(n)
Trang 54HeapSort: Ð nh nghĩa Heap ị
Cây s p th t b ph n hay còn g i là heap ắ ứ ự ộ ậ ọ
là cây nh phân mà giá tr t i m i nút (khác ị ị ạ ỗ
nút lá) đ u không l n h n giá tr c a các con ề ớ ơ ị ủ
c a nó ủ
Ta có nh n xét r ng nút g c c a cây s p th ậ ằ ố ủ ắ ứ
t b ph n có giá tr nh nh t ự ộ ậ ị ỏ ấ
Trang 56HeapSort : Ý t ưở ng gi i thu t ả ậ
(1) Xem m ng ban đ u là m t cây nh phân M i nút trên cây l u tr ả ầ ộ ị ỗ ư ữ
m t ph n t m ng, trong đó a[0] là nút g c và m i nút không là nút lá ộ ầ ử ả ố ỗa[i] có con trái là a[2i+1] và con ph i là a[2i+2] V i cách t ch c này ả ớ ổ ứthì cây nh phân thu đị ược s có các nút trong là các nút a[0], …, a[(n-ẽ2)/2] T t c các nút trong đ u có 2 con, ngo i tr nút a[(n-2)/2] có th ấ ả ề ạ ừ ể
ch có m t con trái (trong trỉ ộ ường h p n là m t s ch n).ợ ộ ố ẵ
(2) S p x p cây ban đ u thành m t heap căn c vào giá tr khoá c a ắ ế ầ ộ ứ ị ủcác nút
(3) Hoán đ i nút g c a[0] cho cho nút lá cu i cùng.ổ ố ố
(4) S p l i cây sau khi đã b đi nút lá cu i cùng đ nó tr thành m t ắ ạ ỏ ố ể ở ộheap m i ớ
L p l i quá trình (3) và (4) cho t i khi cây ch còn m t nút Nút này ặ ạ ớ ỉ ộ
cùng v i các nút lá đã b đi t o thành m t m ng s p theo th t gi m ớ ỏ ạ ộ ả ắ ứ ự ả
Trang 57Thi t k hàm PushDown ế ế
PushDown nh n vào 2 tham s first và last đ đ y nút first xu ng ậ ố ể ẩ ố
Gi s a[first], ,a[last] đã đúng v trí c a m t heap, ngo i tr a[first] ả ử ị ủ ộ ạ ừ
PushDown dùng đ đ y ph n t a[first] xu ng đúng v trí c a nó trong ể ẩ ầ ử ố ị ủcây
Xét a[first], có các kh năng có th x y ra:ả ể ẩ
– N u a[firrst] ch có m t con trái và n u khoá c a nó l n h n khoá c a con trái ế ỉ ộ ế ủ ớ ơ ủ (a[first].key > a[2*first+1].key) thì hoán đ i a[first] cho con trái c a nó và k t ổ ủ ế thúc
– N u a[first] có khoá l n h n con trái c a nó và khoá c a con trái không l n ế ớ ơ ủ ủ ớ
h n khoá c a con ph i thì hoán đ i a[first] cho con trái c a nó, vi c này có ơ ủ ả ổ ủ ệ
th gây ra tình tr ng con trái s không đúng v trí nên ph i xem xét l i con trái ể ạ ẽ ị ả ạ
Trang 58swap(a[r], a[2*r+1])
r = 2*r+1 Đ
S Đ
S
a[r].key > a[2*r+2].key
and a[2*r+2].key < a[2*r+1].key
swap(a[r], a[2*r+2])
r = 2*r+2 Đ
r = last
Trang 60Phân tích hàm PushDown
Ta xét PushDown(0,n-1), t c là PushDown trên cây có n nút ứ
PushDown ch duy t trên m t nhánh nào đó c a cây nh phân, ỉ ệ ộ ủ ị
t c là sau m i l n l p thì s nút còn l i m t n a M t cách c ứ ỗ ầ ặ ố ạ ộ ử ộ ụ
th , trể ước h t PushDown trên cây có n nút; Sau l n l p th ế ầ ặ ứ
nh t, PushDown trên cây có n/2 nút; Sau l n l p th hai, ấ ầ ặ ứ
PushDown trên cây có n/4 nút;… T ng quát, Sau l n l p th i, ổ ầ ặ ứPushDown trên cây có n/2i nút
Nh v y, trong trư ậ ường h p x u nh t (luôn ph i th c hi n vi c ợ ấ ấ ả ự ệ ệ
đ y xu ng) thì l nh l p while ph i th c hi n i l n sao chon/2ẩ ố ệ ặ ả ự ệ ầ i =
1 t c là i=logn (i=logn là s l n l p c a l nh while, trong trứ ố ầ ặ ủ ệ ường
h p x u nh t) Mà m i l n l p ch th c hi n m t l nh IF v i ợ ấ ấ ỗ ầ ặ ỉ ự ệ ộ ệ ớthân l nh IF là l i g i Swap và l nh gán, do đó t n O(1) = 1 ệ ờ ọ ệ ố
đ n v th i gian ơ ị ờ
T đó ta th y PushDown l y O(logn) đ đ y xu ng m t nút ừ ấ ấ ể ẩ ố ộ
trong cây có n nút
Trang 62 Th i gian th c hi n HeapSort là O(nlogn) ờ ự ệ