Bài 2: M t s ph ng pháp s p x p ộ ố ươ ế ắ
ắ
I. Thu t toán s p x p nhanh - Quick Sort ế Ý t ưở
ố
Gi i thu t QuickSort làm vi c nh sau: ậ ả
ư làm biên: th ng ch n là ph n t ậ ng: Có dãy s : a1, a2, ..., an ệ ầ ử Ch n ọ x là m t ph n t ộ ườ ầ ử ở ọ
gi a dãy s . ố ữ
Phân ho c dãy thành 3 dãy con ạ
ớ
1. ak <= x , v i k = 1..i 2. ak = x , v i k = i..j ớ 3. ak > =x , v i k = j..N ớ
Ak<=x Ak=x Ak>=x
ầ ử
N u s ph n t phân ho ch dãy 1, 3 theo ph ế ụ trong dãy con 1, 3 l n h n 1 thì ta ti p t c ớ i thì: d ng. ng pháp trên. ơ c l Ng ượ ạ ế ố ạ ươ ừ
i thu t phân ho ch dãy am, am+1, ., an thành 2 dãy con: ậ ạ
Gi B c 1 : Ch n tùy ý m t ph n t a[k] trong dãy là giá tr biên, ả ướ ầ ử ọ ộ ị
a[i], a[j] n m sai m<= k <=n: x = a[k]; i = m; j = n; ệ ệ ầ ử ặ ỉ ằ
B c 2 : Phát hi n và hi u ch nh c p ph n t ướ v trí: ị
B c 2a : Trong khi (a[i]
ứ
// a[i]>= x; a[j]<=x mà a[j] đ ng sau a[i] Hoán v (a[i],a[j]); ị
1
i++; j--;
ướ
i B c 2.//ch a xét h t m ng ặ ạ ướ ư ế ả
B c 3 : N u i <= j: ế i: c l Ng ượ ạ L p l D ngừ
i thu t s p x p QuickSort m t cách đ ể ả ậ ắ ế ộ ệ
Có th phát bi u gi ể qui nh sau : ư
B c 1 : Phân ho ch dãy a
m … an thành các dãy con :
ướ ạ
- Dãy con 1 : am.. aj <= x - Dãy con 2 : aj+1.. ai-1 = x - Dãy con 1 : ai.. an >= x
ướ
ề ầ ử ơ B c 2 : ế
// dãy con 1 có nhi u h n 1 ph n t m.. aj // dãy con 3 có nhi u h n 1 ph n t ế ề ầ ơ ử
i.. ar
N u ( m < j ) Phân ho ch dãy a ạ N u ( i < n ) Phân ho ch dãy a ạ
Ví d : ụ Cho dãy s a: ố 2 12 6 5 4 15
8 1 ạ l =1, r = 8: x = A[4] =5 Phân ho ch đo n ạ
2
hân ho ch P đo n l =1, r = 3: x = A[2] = 2 ạ ạ
hân ho ch P đo n l = 5, r = 8: x = A[6] = 6 ạ ạ
P
3
hân ho ch đo n l = 7, r = 8: x = A[7] = 6 ạ ạ
D ng. ừ Cài đ t ặ
Ðánh giá gi
ậ ả ệ ủ ụ ộ i thu t QuickSort ph thu c
ạ
ườ ượ ầ ử ớ
ằ còn l ế l n h n (hay b ng) n a s ử ố ạ
, và nh h n (hay b ng) n a s ph n t ầ ử ằ ằ
i thu t ậ Hi u q a th c hi n c a gi ự ệ Tr ch n đ ọ ph n t ầ ử m c, khi đó dãy đ ố log2(n) b ế ắ
đ c phân ho ch ph n t ạ
cướ phân ho ch thì s p x p xong. Nh ng n u m i b ế ư ị ự ạ ầ ử ượ ẽ ị ố
, ph n còn l ầ ầ ỉ
ầ ử ệ
ả ủ ệ vào vi c ch n giá tr m c. ọ ị ố ng h p t ề t nh t x y ra n u m i l n phân ho ch đ u ợ ố ỗ ầ ấ ả c ph n t ử ố median (ph n t ầ ử ơ i) làm ỏ ơ c phân chia thành 2 ph n b ng nhau và c n ầ ầ ượ ạ c ch n có ỗ ướ ọ giá tr c c đ i (hay c c ti u) là m c, dãy s b phân chia thành 2 ể ự i g m ph n không đ u: m t ph n ch có 1 ph n t ạ ồ ề ầ ử ầ ộ ớ ắ c phân ho ch m i s p , do v y c n th c hi n n b (n-1) ph n t ạ ướ ậ ầ x p xong. Ta có b ng t ng k t ổ ả ế ự ế
Tr ng h p ườ ợ Ð ph c t p ộ ứ ạ
T t nh t ấ ố
X u nh t n*log(n) n2 ấ ấ
4
II. Radix sort
Ý t ưở
ớ ậ ướ
ế ế ng: Khác v i các thu t toán tr ậ ộ ư
ậ ộ ướ ơ ở ể ắ
ạ ắ
t r ng, đ đ a m t kh i l ố ượ
c, Radix sort là m t thu t toán ng hoàn toàn khác. N u nh trong các ti p c n theo m t h ị ủ thu t toán khác, c s đ s p x p luôn là vi c so sánh giá tr c a ệ ế ậ thì Radix sort l 2 ph n t ư i d a trên nguyên t c phân lo i th ạ ự ầ ử c a b u đi n. ệ ủ ư Ta bi ế ằ i nh n ng t ng th l n đ n tay ổ ư ớ ệ ế ườ ư ề
ườ ứ ộ ng khác nhau, b u đi n th ư
c tiên, các th đ n cùng m t t nh, thành ph s đ Tr ậ ở ộ ệ ố ướ ố ẽ ượ c ấ ộ ỉ
ng ng. s p chung vào m t lô đ g i đ n t nh thành t ắ ộ
ể ư nhi u đ a ph ng ươ ị ch c m t h th ng phân lo i th phân c p: ạ ư ế ể ử ế ỉ B u đi n các t nh thành này l ỉ ư ự ạ
ệ ư ế ế ộ
ứ ậ
ử ế c trao đ n tay ng ế
ươ ứ i th c hi n công vi c t ệ . Các th đ n cùng m t qu n, huy n s đ t ẽ ượ ệ ự ậ m t lô và g i đ n qu n, huy n t ệ ươ ộ th s đ ư ẽ ượ ườ công vi c s p x p th không quá n ng nh c. ư ệ ằ ệ ươ ng c x p vào chung ứ ng ng. C nh v y, các b c ứ ư ậ i nh n m t cách có h thông mà ậ ệ ặ ộ ọ ế
i qui trình trên, đ s p x p dãy a1, a2, ..., an, Mô ph ng l ế ạ ỏ
gi ể ắ i thu t Radix Sort th c hi n nh sau: ả ư ự
ệ c tiên, ta có th gi Tr ai trong dãy: a1, ậ ướ
s m i ph n t ầ ử ể ả ử ỗ i đa m ch s . ữ ố ố l n l ầ ử ầ ượ ng t ự ệ ơ t theo các ch s hàng đ n ữ ố vi c phân lo i th theo t nh ỉ ư ạ
a2, ..., an là m t s nguyên có t ộ ố Ta phân lo i các ph n t ạ v , hàng ch c, hàng trăm, . t ụ ị thành, qu n huy n, ph ươ ng xã, .. ườ ệ ậ
c th c hi n thu t toán nh sau: ậ ự ư ệ
// k cho bi t ch s dùng đ phân lo i hi n hành Các b ướ B c 1 : ướ ế ữ ố ể ạ
k = 0; ơ ệ ụ
B c 2 : //T o các lô ch a các lo i ph n t // k = 0: hàng đ n v ; k = 1:hàng ch c; ị khác nhau ầ ử ướ ứ ạ
Kh i t o 10 lô B0, B1, ., B9 r ng; ạ ở ạ ỗ
5
B c 3 : ướ
Ð t ai vào lô Bt v i t = ch s th k c a ai; For i = 1 .. n do ặ ữ ố ứ ủ ớ
ướ
N i B0, B1, ., B9 l i (theo đúng trình t ) thành a. ạ ự
B c 4 : ố B c 5 : ướ
c 2. i b ở ạ ướ
k = k+1; N u k < m thì tr l ế i: D ng c l Ng ừ ượ ạ
Ví d ụ Cho dãy s a: ố 701 1725 999 9170 3252 4518 7009 1424 428 1239 8425 7013 Phân lô theo hàng đ n v : ơ ị
0701 12
1725 11
0999 10
9170 9
3252 8
4518 7
7009 6
1424 5
0428 4
1239 3 0999
8425 2 4518 7009 1725
1 0428 1239 7013 9170 0701 3252 7013 1424 8425
CS A 0 1 2 3 4 5 6 7 8 9
6
Các lô B dùng đ phân lo i ể ạ
Phân lô theo hàng ch c: ụ
0999 12
7009 11
1239 10
4518 9
0428 8
1725 7
8425 6
1424 5
0428 7013 4
1725 3252 3
0701 7009 4518 8425 2
9170 0701 7013 1424 1239 3252 9170 0999 1
CS A 0 1 2 3 4 5 6 7 8 9
Phân lô theo hàng trăm:
12 0999
11 9170
10 3252
9 1239
8 0428
7 1725
6 8425
5 1424
4 4518
7
3 7013 0428
2 7009 7013 3252 8425 1725
0701 1 0701 7009 9170 1239 1424 4518 0999
CS A 0 1 2 3 4 5 6 7 8 9
Phân lô theo hàng ngàn:
12 0999
11 1725
10 0701
9 4518
8 0428
7 8425
6 1424
5 3252
4 1239
3 9170 0999 1725
2 7013 0701 1424 7013
1 7009 0428 1239 3252 4518 7009 8425 9170
CS A 0 1 2 3 4 5 6 7 8 9
L y các ph n t t các lô B0, B1, ., B9 n i l i thành a: ầ ử ừ ấ ố ạ
12 9170
11 8425
10 7013
9 7009
8 4518
7 3252
8
6 1725
5 1424
4 1239
3 0999
2 0701
1 0428
CS A 0 1 2 3 4 5 6 7 8 9
Ðánh giá gi i thu t ậ
V i m t dãy n s , m i s có t ả ộ ố ố ậ ỗ ố
ầ ự ớ ệ
ch đ
ể ệ ự
ố ọ ợ ấ ấ ườ
ớ ắ ư t nh t. M i dãy ố ế
ng h p x u nh t và t ấ c s p v i chi phí nh nhau n u chúng có cùng s .
ậ ệ ế ắ ớ
ả ư ụ ự ố
ậ ơ ữ ố ủ ừ
ố ượ ố ậ ề
ự ế ỗ ổ
ể
ả
ễ ể ể ấ ợ ễ ấ
, thu t toán Radix sort i đa m ch s , thu t toán ữ ố th c hi n m l n các thao tác phân lô và ghép lô. Trong thao tác c xét đúng m t l n, khi ghép cũng phân lô, m i ph n t ộ ầ ầ ử ỉ ượ ỗ v y. Nh v y, chi phí cho vi c th c hi n thu t toán hi n nhiên ậ ệ ư ậ ậ là O(2mn) = O(n). NH N XÉT Ậ Thu t toán không có tr ậ s đ u đ ượ ố ề ph n tầ ử và các khóa có cùng chi u dài ề Thu t toán cài đ t thu n ti n v i các m ng có khóa s p x p là ặ hay s ) h n là khóa s nh trong ví d do tránh chu i (ký t ố ỗ đ c chi phí l y các ch s c a t ng s . ố ấ ượ ng lô nhi u (10 khi dùng s th p phân, 26 Tuy nhiên, s l ướ ủ ti ng anh, ...) nh ng t ng kích th c c a khi dùng chu i ký t ư t c các lô ch b ng dãy ban đ u nên ta không th dùng m ng t ả ấ ả ầ ỉ ằ ữ ệ đ bi u di n B (B0->B9). Nh v y, ph i dùng c u trúc d li u ư ậ ể ể đ ng đ bi u di n B => Radix sort r t thích h p cho s p x p ế ắ ộ trên danh sách liên k t.ế ắ ầ ử ề ậ
Khi s p các dãy không nhi u ph n t s m t u th so v i các thu t toán khác. ẽ ấ ư ế ậ ớ
9
III. S p x p cây - Heap sort ế ắ
1.Ý t
c i, ph ng: ậ
ưở Nh n xét: Khi tìm ph n t ự ế ọ b ng pháp ươ ấ ở ướ c các thông tin đã có ượ
c do các phép so sánh nh nh t ầ ử ỏ s p x p ch n tr c ti p không t n d ng đ ậ ụ ế ắ c i-1. b đ ở ướ ượ
ự ậ ộ
ể i ta tìm cách xây d ng m t thu t toán s p ắ ượ ể
ắ M u chôt đ gi Vì lý do trên ng ườ x p có th kh c ph c nh ụ ế ể ả ề ừ ả
c đi m này. ấ ế c m t c u trúc d li u cho phép tích lũy các thông tin v s i quy t v n đ v a nêu là ph i tìm ra ề ự
trong qua trình s p x p. ấ đ ộ ấ ượ so sánh giá tr các ph n t ị ữ ệ ầ ử ế
Gi ượ ố c b
ế trí theo quan h so sánh và t o thành s đ d ng cây nh sau : s d li u c n s p x p là dãy s : ả ử ữ ệ ầ ắ ơ ồ ạ ạ ệ ắ ố 5 2 6 4 8 1 đ ư
Trong đó m t ph n t m c i chính là ph n t ầ ử ở ứ
ầ ử l n trong ớ ố ủ m c 0 (nút g c c a ở ứ ầ ử ở ứ i+1, do đó ph n tầ ử
ộ m c ầ ử ớ
c p ph n t ặ cây) luôn là ph n t N u lo i b ph n t ạ ỏ
ế ấ ề ư ỉ ả ậ
ạ ỏ ế
ể ử ụ ế ế ượ ả
c k ti p có th s d ng l i. b ở ướ
l n nh t c a dãy. ấ ủ g c ra kh i cây (nghĩa là đ a ph n t ầ ử ỏ ầ ử ố l n nh t v đúng v trí), thì vi c c p nh t cây ch x y ra trên ậ ị ệ ớ m i lo i b , còn các nhánh nh ng nhánh liên quan đ n ph n t ầ ử ớ ữ ạ i khác đ c b o toàn, nghĩa là b ướ các k t qu so sánh c hi n t ế ệ ạ ả Trong ví d trên ta có : ụ
10
ế ị ể ỗ ố
Lo i b 8 ra kh i cây và th vào các ch tr ng giá tr -∞ đ ạ ỏ ti n vi c c p nh t l ệ ậ ỏ i cây : ậ ạ ệ
Ti n hành nhi u l n vi c lo i b ph n t ề ầ ầ ử ố ủ ạ ỏ
t c các ph n t ầ ử ủ ế
ề ẽ ế ắ
ế đ n khi t ế ph n t ầ ử đây là ý t i thu t s p x p cây. g c c a cây cho ệ c a cây đ u là -∞, khi đó x p các ấ ả lo i b trên cây s có dãy đã s p x p. Trên theo th t ứ ự ạ ỏ ng c a gi ả ủ ưở ậ ắ ế
ữ ệ ể 2. C u trúc d li u Heap ặ ệ ộ
ch c m t c u trúc l u tr ữ ữ ệ ả
ấ Tuy nhiên, đ cài đ t thu t toán này m t cách hi u qu , ả ể d li u có kh năng th trong cây v i n ô nh thay vì ậ ư ộ ấ c quan h c a các ph n t ầ ử ớ ớ
c n ph i t ả ổ ứ ầ hi n đ ệ ủ ượ ệ 2n-1 nh trong ví d . ụ ư
ệ ng pháp s p x p Heapsort do ế ắ
c các khó khăn trên. Khái ni m heap và ph ấ J.Williams đ xu t đã gi ề ươ i quy t đ ế ượ ả
11
ị
s xét tr Gi ng h p s p x p tăng d n, khi đó Heap đ Ð nh nghĩa Heap: ả ử ườ ợ ắ ế ầ
ầ ử ap, a2 ,... , aq tho các quan h ả c ượ ệ
đ nh nghĩa là m t dãy các ph n t ộ ị sau v i m i i thu c [p, q]: ộ ọ ớ
1/. ai >= a2i
2/. liên ặ ầ ử
ai >= a2i+1 {(ai , a2i), (ai ,a2i+1) là các c p ph n t đ i } ớ
Heap có các tính ch t sau : ấ
ế ộ
Tính ch t 1 : N u ap , a2 ,... , aq là m t heap thì khi c t b hai đ u c a heap, dãy con còn l ắ ỏ ộ i v n là m t ầ ủ ạ ẫ ộ ố
ấ m t s ph n t ầ ử ở heap.
Tính ch t 2 : N u ap , a2 ,... , aq là m t heap thì ph n t ầ ử a1 ộ
ấ (đ u heap) luôn là ph n t l n nh t trong heap. ầ ấ
Tính ch t 3 : M i dãy ap , a2 ,... , aq, dãy con aj, aj+1,…, ar
ế ầ ử ớ ọ ớ ấ ộ t o thành m t heap v i j=(q div 2 +1). ạ
ả ả i thu t Heapsort : i thu t Heapsort tr i qua 2 giai đo n : ả
ạ ầ
ệ ế ắ Ð a ph n t cu i dãy: Gi Gi Giai đo n 1 :Hi u ch nh dãy s ban đ u thành heap; ỉ Giai đo n 2: S p x p dãy s d a trên heap: ấ ề ị ậ ậ ạ ạ B c 1: ướ ầ ử l n nh t v v trí đúng ố ố ự ớ ư ở ố
r = n; Hoánv (a1 , ar );
Lo i b ph n t
i c a dãy t ị ầ ử ớ ạ ủ l n nh t ra kh i heap: r = r-1; ỏ ấ ừ a1 , a2 ... ar thành m tộ ạ ỏ ầ
B c 2: ướ Hi u ch nh ph n còn l ỉ ệ heap.
B c 3: ướ ầ ử ): L p l ặ ạ i B c 2 ướ
ế c l Ng ượ ạ N u r>1 (heap còn ph n t i : D ng ừ
12
ạ ấ ệ ể ự
ặ
an/2, an/2-1, ., a1 ta s nhân đ ượ ẽ
ằ D a trên tính ch t 3, ta có th th c hi n giai đo n 1 b ng ự heap m c nhiên an/2+1 , an/2+2 ... an, sau đó cách b t đ u t ắ ầ ừ c heap thêm d n các ph n t ầ ử ầ theo mong mu n. ố Ví d ụ Cho dãy s a:ố 12 2 8 5 1 6 4 15 Giai đo n 1: hi u ch nh dãy ban đ u thành heap ệ ạ ầ ỉ
Giai đo n 2: S p x p dãy s d a trên heap : ố ự ế ạ ắ
13
th c hi n t ng t cho r=5,4,3,2 ta đ c: ự ệ ươ ự ượ
Cài đ t ặ
14
Ðánh giá gi i thu t ả ậ
ự ắ ỗ c m i
b ướ ầ ạ ấ ề ổ
Trong giai đo n s p x p ta c n th c hi n n-1 b ướ ệ ầ ế (n-1), log2 (n-2), … 1 phép đ i ch i. ỗ 2 Nh v y đ ph c t p thu t toán Heap sort O(nlog2n) ậ c c n nhi u nh t là log ộ ứ ạ ư ậ
15