H ng d n chi ti t các gi i thu t tìm ki mướ ế ế
Merge sort
Nguyên t c :
VD ta có
12 13 45 32 100 34 65 10
Ta có trên là 8 ph n t c n đ c s p x p : ượ ế
Ý t ng c a merge sort là thay vì s p x p 8 ph n t (khó s p ) thì ta chia đôi dãy đó ra làmưở ế
đôi (s ph n t nh h n --> s p d h n ) và s p x p các dãy con r i ghép 2 dãy con l i ơ ơ ế
( g i là merge 2 dãy con )
V y ta làm nh sau: ư
Chia đôi --> đ c hai dãy con m i là 12 13 45 32 và 100 34 65 10ượ
s p 2 dãy con l i : 12 13 45 32 g i là dãy A
100 34 65 10 g i là dãy B
+ Mu n s p A ta cũng làm y nh trên ư
Chia đôi A , đ c 2 dãy m i là A11 = { 12 13 } A12 = {45 32 }ượ
Chia đôi B đ c 2 dãy m i là B11 = {100 34} B12 = {65 10 }ượ
+ S p x p A11, B11 , A12 , B12 ế
+ Mu n s p x p A11 thì ta cũng chia đôi đ n khi s p đ c ế ế ượ
ta có 2 dãy con là A21 = {12} A22 = { 13}
S p 2 dãy con trên đ c ( đ n gi n vì ch có m t ph n t ) là A21 = {12 } A22 = {13} ượ ơ
S p xong thì ta merge l i thành A11 = { 12 13 }
+ T ng t s p x p cho B11 , A12 , B12 ta cũng cóươ ế
B11 = {34 100} B12 = {10 65 } A12 = {32 45 }
+S p x p xong , ta s merge l i A11 , A12 thành A = { 12 13 32 45 } ế
B11 , B12 thành B = { 10 34 65 100 }
S p xong A , B , ta s merge chúng l i thành dãy ban đ u :
{10 12 13 32 34 45 65 100 }
Ph ng pháp merge:ươ
VD A = { 12 13 32 45 }
B = { 10 34 65 100}
Đ u tiên l y ph n t đ u tiên c a A và B : 12 và 10
10 < 12 nên ta l y 10 b vào m ng k t qu là C = {10} ế
Gi l i s 12 , và l y ti p ph n t thay th 10 trong m ng B là 34 ế ế
So sánh 12 và 34 . 12 < 34 , l y 12 ra và b vào C = {10 12}
Gi l i 34 . L y ph n t k ti p đ thay cho 12 trong m ng A là 32 ế ế
So sánh 32 và 34 ch n 32 b v o C = { 10 12 32 }
........ Làm t ng t ......ươ
Đ n b c cu i cùng A h t ph n t B còn l i B = { 65 100}ế ướ ế
Ta s b toàn b m ng B vào C . K t qu C đã đ c merge và có th t ế ượ
Gi i thu t cho tr ng h p dùng list đ ch a các ph n t c n sort)ườ
Sortable_List là m t l p list có đ c đi m là có hàm sort
Node là m t template class bi u di n cho các node trong list
Record là class dùng đ bi u di n data c n s p x p . ( VD nh s p m t dãy các s nguyên , ế ư
hay VD là s p theo tên c a các record bao g m tên , tu i , s đi n tho i ...)
sublist là list c n s p x p ế
Quick sort
Ý t ng:ưở
G n gi ng nh merge sort , ta s chia đôi m ng c n x p r i s p x p các m ng con , sau đó ư ế ế
s ghép m ng con đã s p x p thành m ng ban đ u nh ng đã s p x p ế ư ế
Đi m khác nhau: Là ch ta chia đôi m ng con theo nguyên t c riêng :
G i đi m mà t i đó ta chia đôi m ng ban đ u có tr là pivot (không nh t thi t là n m đúng ế
v trí chính gi a . Nh ng gi i thu t s ch y t t n u nó n m g n đi m chính gi a) và ta s ư ế
không c n merge 2 dãy con (do đó nhìn chung s ch y nhanh h n ) , th a đi u ki n là t t c ơ
nh ng ph n t bên trái pivot đ u nh h n pivot và n m bên ph i pivot thì l n h n pivot ơ ơ
VD :
2 4 6 7 18 14 13
Ta ch n ph n t pivot = 7 ( do bên trái c a nó nh h n pivot = 7 , bên ph i l n h n pivot = ơ ơ
7 ) (Th c ra ta ph i tìm pivot , do đây làm b ng tay nên d th y )
Chia đôi : A = { 2 4 6 } B = { 18 14 13 }
+ S p A
+ Trong dãy A ta cũng ch n ph n t pivot là 4
+ Đ c 2 dãy con là A11 = {2 } A12 = {6}ượ
+ S p A11 ( s p s n r i )
+ S p A12 ( s p s n r i )
+ T o l i m ng A = { A11 đ c s p , pivot , A12 đ c s p } = {2 4 6 } ượ ượ
+S p B . Trong B ta không th y đ c pivot do ch n cái nào ta cũng không th y th a . ượ
Nh ng m c tiêu c a quick sort là làm sao ta đ c dãyư ượ
<C= dãy có tr nh h n pivot > pivot < D= dãy có tr l n h n pivot > ơ ơ
S p 2 dãy con C , D r i ghép l i ta đ c dãy s p th t . ượ
Vì v y áp d ng m t gi i thu t tìm pivot trong B( s trình bày sau ) ta s đ c C = { 13} D ượ
= {18} và pivot là 14 .
+ S p dãy con C , D ( do ch có m t ph n t nên không s p , ho c tìm pivot)
+ Ghép l i t o thành m ng B đ c s p B = { 13 14 18 } ượ
+Ghép A và B đ t o thành m ng đ c s p x p ban đ u ượ ế
PS : Hi u qu c a gi i thu t quicksort ph thu c r t nhi u vào vi c ch n cho đ c pivot ượ
t t ( t c n u pivot n m g n chính gi a thì đ t g n t i u ) ế ư
Heap Sort
Heap là m t c u trúc d li u , có th đ c bi u di n thông qua 2 cách : ượ
-D ng th 1: D ng cây nh phân có đ c đi m là node cha thì l n h n 2 node con tr c ti p ơ ế
c a nó .
-D ng th 2: n u ta đánh s các node theo th t t trên xu ng và t trái qua . B t đ u là ế
node root = 0 , thì ta có th đ nh nghĩa heap thông qua m ng m t chi u , có đ c đi m là
ph n t th k s l n h n các ph n t th 2k+1 và 2k+2 . Ta có th d nh n th y là phàn t ơ
th 0 s t ng ng v i root trong cây cách bi u di n th 1 ươ
Nguyên t c s p x p c a heap sort ế
D a vào tính ch t c a heap trong cách bi u di n th 1 và th 2 , ta có th th y ph n t đ u
tiên trong cách bi u di n theo m ng s là ph n t l n nh t ---> cách s p x p đ n gi n là : ( ế ơ
G i m ng ban đ u là A )
Kh i t o : T o heap t m ng ban đ u đã cho (m ng A )
1. L y ph n t đ u tiên trong m ng ra b vào m ng k t qu ế
2. T o l i heap t m ng A
3.Quay l i b c 1 ướ
VD : Ta l y m t m ng đã đ c t o thành m t heap : ượ
y r p d f b k a c
L y ph n t đ u tiên là y b vào m ng k t qu C = { y } ế
khi này A = r p d f b k a c
T o heap A = r f p d c b k a
L y ph n t đ u tiên ra là r b vào m ng C = { r y }
Khi này A = { f p d c b k a }
T o heap cho A = { p f k d c b a}
L y ph n t đ u tiên ra là p b vào m ng C = { p r y }
Khi này A = { f k d c b a }
T o heap cho A = { k f b d c a}
L y ph n t đ u tiên ra là k b vào m ng C = { k p r y }
Khi này A = { f b d c a }
T o heap cho A = { f d b a c}
L y ph n t đ u tiên ra là f b vào m ng C = { f k p r y }
Khi này A = { b d c a }
T o heap cho A = { d c b a}
L y ph n t đ u tiên ra là d b vào m ng C = {d f k p r y }
Khi này A = { c b a }
T o heap cho A = { c a b }
L y ph n t đ u tiên ra là c b vào m ng C = {c d f k p r y }
Khi này A = { b a }
T o heap cho A = { b a }
L y ph n t đ u tiên ra là b b vào m ng C = {b c d f k p r y }
Khi này A = { a }
T o heap cho A = { a }
K t thúc ta có đ c m ng C đã có th t .ế ượ
C i ti n: ế
Ta có th h n ch vi c s d ng thêm m ng C b ng cách t n d ng luôn m ng A ban đ u . ế
Ta làm nh sauư
A = y r p d f b k a c
B c 1 :ướ
L y y ra
L y c ra
B y vào ch c a c .
B c vào ch c a y
Khi ta b y vào ch c a c thì gi ng nh ta b y v o m ng C . ư
Khi này m ng A s coi nh g m 2 ph n A = c r p d f b k a ---- y ư
B c 2 : t o heap cho ph n đ ng tr c c a A là c r p d f b k aướ ướ
Ph n sau là ch a y đ nguyên
Ta s có A m i là : r f p d c b k a -- y
Quay l i b c 1 : L y r , a ra và swap r và a ướ
A s thành A= a f p d c b k -- r y
T o heap cho A = p f k d c b a -- r y
...........
Làm t ng t đ n khi k t thúcươ ế ế
Qua VD ta th y r ng ph n quan tr ng nh t là làm sao sinh ra heap t m t m ng cho tr c ướ
Sau đây là ph n code cho ph n c i ti n ế
Gi i thu t
Post Condition : Dùng đ ph c h i l i heap .
Pre Condition :
Ta s có A m i là : r f p d c b k a -- y
Quay l i b c 1 : L y r , a ra và swap r và a ướ
A s thành A= a f p d c b k -- r y
T o heap cho A = p f k d c b a -- r y
Thì khi này current chính là a
low là 0
high là 7
Insertion Sort
VD :
A = { 5 8 6 3 10 }
Insertion sort làm nh sau :ư
Chia m ng A làm 2 ph n sorted và unsorted
Ban đ u sorted là B = { 5 }
Unsorted là C = { 8 6 3 10 }
L n làm th nh t :
L y ph n t đ u tiên c a C là 8 ra---> C = { 6 3 10 }
Tìm v trí c a s 8 trong m ng B ---> B = { 5 8 }
L n làm th hai :
L y ph n t đ u tiên c a C là 6 ra---> C = { 3 10 }
Tìm v trí c a s 6 trong m ng B ---> B = { 5 6 8 }
L n làm th ba :
L y ph n t đ u tiên c a C là 3 ra---> C = { 10 }
Tìm v trí c a s 3 trong m ng B ---> B = { 3 5 6 8 }
L n làm th t : ư
L y ph n t đ u tiên c a C là 10 ra---> C = { }
Tìm v trí c a s 10 trong m ng B ---> B = { 3 5 6 8 10}
K t thúc thu t toánế