You are on page 1of 21

u trúc d li u và gi i thu t

Ch ng 4. Tìm ki m và s p x p

4.1. Gi i thi u
Trong h u h t các h l u tr , qu n lý d li u, thao tác tìm ki m th ng c th c
hi n nh t khai thác thông tin:
Ví du: tra c u t n, tìm sách trong th vi n...
Do các h th ng thông tin th ng ph i l u tr m t kh i l ng d li u áng k , nên
vi c xây d ng các gi i thu t cho phép tìm ki m nhanh s có ý ngh a r t l n. N u d li u
trong h th ng ã c t ch c theo m t tr t t nào ó, thì vi c tìm ki m s ti n hành
nhanh chóng và hi u qu h n:
Ví d : các t trong t n c s p x p theo t ng v n, trong m i v n l i cs p
x p theo trình t alphabet; sách trong th vi n c x p theo ch …
Vì th , khi xây d ng m t h qu n lý thông tin trên máy tính, bên c nh các thu t
toán tìm ki m, các thu t toán s p x p d li u c ng là m t trong nh ng ch c quan
tâm hàng u.
Hi n nay ã có nhi u gi i thu t tìm ki m và s p x p d c xây d ng, m c hi u
qu c a t ng gi i thu t còn ph thu c vào tính ch t c a c u trúc d li u c th mà nó tác
ng n. D li u c l u tr ch y u trong b nh chính và trên b nh ph , do c
i m khác nhau c a thi t b l u tr , các thu t toán tìm ki m và s p x p c xây d ng
cho các c u trúc l u tr trên b nh chính ho c ph c ng có nh ng c thù khác nhau.
Ch ng này s trình bày các thu t toán s p x p và tìm ki m d li u c l u tr trên b
nh chính - g i là các gi i thu t tìm ki m và s p x p n i.

4.2. Các gi i thu t tìm ki m


Có 2 gi i thu t th ng c áp d ng tìm ki m d li u là tìm tuy n tính và tìm
nh phân. Ð n gi n trong vi c trình bày gi i thu t, bài toán c c t nh sau:
T p d li u c l u tr là dãy s : a1, a2,...,aN (l u ý trong ngông ng C ch s
m c nh ban u là 0).
Gi s ch n c u trúc d li u m ng l u tr dãy s này trong b nh chính và
khoá c n tìm là x, ta có khai báo:
int a[N];
int x;
4.2.1. Tìm ki m tuy n tính – Linear Search (tu n t - SequentialSearch)
v Gi i thu t:
Tìm tuy n tính là m t k thu t tìm ki m r t n gi n và c n. Thu t toán ti n
hành so sánh x l n l t v i ph n t th nh t, th hai,... c a m ng a cho n khi g p c
ph n t có khóa c n tìm, ho c ã tìm h t m ng mà không th y x. Các b c ti n hành nh
sau:
B c 1 (Input): Nh p m ng s nguyên a và s nguyên x.
c 2: i = 1; // b t u t ph n t u tiên c a dãy.

Ch ng 4. Tìm ki m và s p x p Trang 25
u trúc d li u và gi i thu t
c 3: So sánh a[i] v i x, có 2 kh n ng:
− a[i] = x: Tìm th y. Sang b c 5.
− a[i] != x: Sang b c 4.
c 4: i = i+1; // xét ti p ph n t k trong m ng
− N u i > N: H t m ng, không tìm th y. Sang b c5
− Ng c l i: L p l i b c 3.
c 5 (Output): In ra k t qu . K t thúc thu t toán.
Ví d : Cho dãy s a: 12 2 8 5 1 6 4 15
N u giá tr c n tìm là 8, gi i thu t c ti n hành nh sau:

i=1

i=2

i=3

D ng: In ra k t qu .

v Cài t:
T mô t trên ây c a thu t toán tìm tuy n tính, có th cài t hàm LinearSearch
xác nh v trí c a ph n t có khoá x trong m ng a:
int LinearSearch (int a[], int N, int x) {
int i = 0;
while ((i<N) && (a[i]!=x )) i ++;
if (i==N) return -1; // tìm h t m ng nh ng không có x
else return i; // a[i] là ph n t có khoá x
}
Trong cài t trên ây, nh n th y m i l n l p c a vòng l p while ph i ti n thành
ki m tra 2 u ki n (i<N) - i u ki n biên c a m ng – và (a[i]!=x )- i u ki n ki m tra
chính.Nh ng th t s ch c n ki m tra u ki n chính(a[i] !=x), c i ti n cài t, có th
dùng ph ng pháp "lính canh" - t thêm m t ph n t có giá tr x vào cu i m ng, nh
v y b o m luôn tìm th y x trong m ng, sau ó d a vào v trí tìm th y k t lu n. Cài

Ch ng 4. Tìm ki m và s p x p Trang 26
u trúc d li u và gi i thu t
t c i ti n sau ây c a hàm LinearSearch giúp gi m b t m t phép so sánh trong vòng
l p:
int LinearSearch (int a[],int N,int x) {
int i = 0; // m ng g m N ph n t t a[0]..a[N-1]
a[N] = x; // thêm ph n t th N+1
while (a[i] != x ) i ++;
if (i==N)
return -1; // tìm h t m ng nh ng không có x
return i; // tìm th y x t i v trí i
}
v Ðánh giá gi i thu t:
Có th c l ng ph c t p c a gi i thu t tìm ki m qua s l ng các phép so
sánh c ti n hành tìm ra x. Ta có b ng phân tích sau:
Tr ng h p S l n so sánh Gi i thích
T t nh t 1 Ph n t u tiên có giá tr x
X u nh t N+1 Không có giá tr x trong m ng
Gi s xác su t các ph n t trong
Trung bình (N +1)/2
m ng nh n giá tr x là nh nhau
V y gi i thu t tìm tuy n tính có ph c t p tính toán c p n: T(n) = O(n)
v Nh n xét:
− Gi i thu t tìm tuy n tính không ph thu c vào th t c a các ph n t m ng, do
v y ây là ph ng pháp t ng quát nh t tìm ki m trên m t dãy s b t k .
− M t thu t toán có th c cài t theo nhi u cách khác nhau, k thu t cài t
nh h ng n t c th c hi n c a thu t toán.
4.2.2. Tìm ki m nh phân (Binary Search)
v Gi i thu t:
Ð i v i nh ng dãy s ã có th t ( gi s th t t ng ), các ph n t trong dãy có
quan h ai -1 ai ai+1, t ó k t lu n c n u x > ai thì x ch có th xu t hi n trong
o n [ai+1,aN] c a dãy, ng c l i n u x < ai thì x ch có th xu t hi n trong n [a1,ai-1]
c a dãy. Gi i thu t tìm nh phân áp d ng nh n xét trên ây tìm cách gi i h n ph m vi
tìm ki m sau m i l n so sánh x v i m t ph n t trong dãy. Ý t ng c a gi i thu t là t i
m i b c ti n hành so sánh x v i ph n t n m v trí gi a c a dãy tìm ki m hi n hành,
d a vào k t qu so sánh này quy t nh gi i h n dãy tìm ki m b c k ti p là n a
trên hay n a d i c a dãy tìm ki m hi n hành. Gi s dãy tìm ki m hi n hành bao g m
các ph n t aleft.. aright, các b c ti n hành nh sau:
B c 1 (Input): Nh p m ng s nguyên a và s nguyên x.
c 2: left = 1; right = N; // tìm ki m trên t t c các ph n t .
c 3: mid = (left + right)/2; // l y m c so sánh
− a[mid] = x: Tìm th y. D ng
Ch ng 4. Tìm ki m và s p x p Trang 27
u trúc d li u và gi i thu t
− a[mid] > x: // tìm ti p x trong dãy con a[left].. a[mid -1]
right =midle - 1;
− a[mid] < x: // tìm ti p x trong dãy con a[mid+1]..a[right]
left = mid + 1;
c 4: N u left right // còn ph n t ch a xét tìm ti p.
− L pl iB c 2.
− Ng c l i: D ng; // Ðã xét h t t t c các ph n t
c 5 (Output): In ra k t qu . K t thúc thu t toán.
Ví d : Cho dãy s a: 1 2 4 5 6 8 12 15
N u giá tr c n tìm là 8, gi i thu t c ti n hành nh sau:

left = 1
right = 8
midle = 4

left = 5
right = 8
midle = 6

D ng: In ra k t qu .

v Cài t:
Thu t toán tìm nh phân có th c cài t thành hàm BinarySearch:
int BinarySearch(int a[],int N,int x ){
int left =0; right = N-1;
int midle;
do {
mid = (left + right)/2;
if (x = a[midle]) return midle; //Th y x t i mid
else
if (x <a[midle]) right = midle -1;
else left = midle +1;
} while (left <= right);
return -1; // Tìm h t dãy mà không có x
}
v Ðánh giá gi i thu t
Tr ng h p gi i thu t tìm nh phân, có b ng phân tích sau:
Ch ng 4. Tìm ki m và s p x p Trang 28
u trúc d li u và gi i thu t
Tr ng h p S l n so sánh Gi i thích
T t nh t 1 Ph n t u tiên có giá tr x
X u nh t logN Không có giá tr x trong m ng
Gi s xác su t các ph n t trong
Trung bình logN/2
m ng nh n giá tr x là nh nhau
V y gi i thu t tìm nh phân có ph c t p tính toán c p n: T(n) = O(logn)
v Nh n xét
− Gi i thu t tìm nh phân d a vào quan h giá tr c a các ph n t m ng nh
ng trong quá trình tìm ki m, do v y ch áp d ng c cho nh ng dãy ã có
th t .
− Gi i thu t tìm nh phân ti t ki m th i gian h n r t nhi u so v i gi i thu t tìm
tuy n tính do T(nh phân) = O(logn) < T(tuy n tính) = O(n).
Tuy nhiên khi mu n áp d ng gi i thu t tìm nh phân c n ph i xét n th i gian s p
x p dãy s th a u ki n dãy s có th t . Th i gian này không nh , và khi dãy s
bi n ng c n ph i ti n hành s p x p l i. T t c các nhu c u ó t o ra khuy t m chính
cho gi i thu t tìm nh phân. Ta c n cân nh c nhu c u th c t ch n m t trong hai gi i
thu t tìm ki m trên sao cho có l i nh t

4.3. Các gi i thu t s p x p c b n


S p x p là quá trình x lý m t danh sách các ph n t (ho c các m u tin) t
chúng theo m t th t th a mãn m t tiêu chu n nào ó d a trên n i dung thông tin l u
gi t i m i ph n t .
T i sao c n ph i s p x p các ph n t thay vì nó d ng t nhiên (ch a có th t )
v n có ? Ví d c a bài toán tìm ki m v i ph ng pháp tìm ki m nh phân và tu n t
tr l i câu h i này.
Khi kh o sát bài toán s p x p, ta s ph i làm vi c nhi u v i m t khái ni m g i là
ngh ch th .
v Khái ni m ngh ch th :
Xét m t m ng các s a0, a1,. an.
N u có i < j và ai > aj, thì ta g i ó là m t ngh ch th .
M ng ch a s p x p s có ngh ch th .
M ng ã có th t s không ch a ngh ch th . Khi ó a0 s là ph n t nh nh t r i
n a1, a2,.
a0 a1 a2 … an
Nh v y, s p x p m t m ng, ta có th tìm cách gi m s các ngh ch th trong
m ng này b ng cách hoán v các c p ph n t ai, aj n u có i < j và ai > aj theo m t qui lu t
nào ó.
Cho tr c m t dãy s a1, a2,..., aN c l u tr trong c u trúc d li u m ng
int a[N];

Ch ng 4. Tìm ki m và s p x p Trang 29
u trúc d li u và gi i thu t
S p x p dãy s a1, a2,..., aN là th c hi n vi c b trí l i các ph n t sao cho hình
thành c dãy m i ak1, ak2,..., akN có th t (gi s xét th t t ng) ngh a là aki aki-1.
Mà quy t nh c nh ng tình hu ng c n thay i v trí các ph n t trong dãy, c n
d a vào k t qu c a m t lo t phép so sánh. Chính vì v y, hai thao tác so sánh và gán là
các thao tác c b n c a h u h t các thu t toán s p x p.
Khi xây d ng m t thu t toán s p x p c n chú ý tìm cách gi m thi u nh ng phép so
sánh và i ch không c n thi t t ng hi u qu c a thu t toán. Ð i v i các dãy s c
u tr trong b nh chính, nhu c u ti t ki m b nh c t n ng, do v y nh ng thu t
toán s p x p òi h i c p phát thêm vùng nh l u tr dãy k t qu ngoài vùng nh l u
tr dãy s ban u th ng ít c quan tâm. Thay vào ó, các thu t toán s p x p tr c
ti p trên dãy s ban u - g i là các thu t toán s p x p t i ch - l i c u t phát
tri n. Ph n này gi i thi u m t s gi i thu t s p x p t n gi n n ph c t p có th áp
d ng thích h p cho vi c s p x p n i.
4.3.1. S p x p ki u l a ch n (Selection Sort)
v Gi i thu t
Ta th y r ng, n u m ng có th t , ph n t ai luôn là min(ai, ai+1,., an-1). Ý t ng c a
thu t toán ch n tr c ti p mô ph ng m t trong nh ng cách s p x p t nhiên nh t trong
th c t : ch n ph n t nh nh t trong N ph n t ban u, a ph n t này v v trí úng là
u dãy hi n hành; sau ó không quan tâm n nó n a, xem dãy hi n hành ch còn N-1
ph n t c a dãy ban u, b t u t v trí th 2; l p l i quá trình trên cho dãy hi n hành...
n khi dãy hi n hành ch còn 1 ph n t . Dãy ban u có N ph n t , v y tóm t t ý t ng
thu t toán là th c hi n N-1 l t vi c a ph n t nh nh t trong dãy hi n hành v v trí
úng u dãy. Các b c ti n hành nh sau:
B c 1 (Input): Nh p m ng a.
c 2: i = 1; // b t u t ph n t u tiên c a m ng.
c 3: Tìm ph n t a[min] nh nh t trong dãy hi n hành t a[i] n a[N]
c 4: Hoán v a[min] và a[i]
c 5:
− N ui N-1 thì i = i+1; L p l i B c3
− Ng c l i: D ng. //N-1 ph n t ã n m úng v trí.
c 6 (Output): In ra k t qu . K t thúc thu t toán.
Ví d : Cho dãy s a: 12 2 8 5 1 6 4 15

Ch ng 4. Tìm ki m và s p x p Trang 30
u trúc d li u và gi i thu t

v Cài t:
Cài t thu t toán s p x p ch n tr c ti p thành hàm SelectionSort:
void SelectionSort(int a[],int N ) {
int min; // ch s ph n t nh nh t trong dãy hi n hành
for (int i=0; i<N-1 ; i++) {
min = i;
for(int j = i+1; j <N ; j++)
if (a[j ] < a[min])
min = j; // ghi nh n v trí ph n t hi n nh nh t
Hoanvi(a[min], a[i]);
}
}
v Ðánh giá gi i thu t:
Ð i v i gi i thu t ch n tr c ti p, có th th y r ng l t th i, bao gi c ng c n (n-
i) l n so sánh xác nh ph n t nh nh t hi n hành. S l ng phép so sánh này không

Ch ng 4. Tìm ki m và s p x p Trang 31
u trúc d li u và gi i thu t
ph thu c vào tình tr ng c a dãy s ban u, do v y trong m i tr ng h p có th k t
lu n:
n −1
n(n − 1)
Sô l n so sánh = ∑ (n − i ) =
i =1 2
S l n hoán v (m t hoán v b ng 3 phép gán) l i ph thu c vào tình tr ng ban u
c a dãy s , ta ch có th c l c trong t ng tr ng h p nh sau:
Tr ng h p S l n so sánh S phép gán
T t nh t n(n-1)/2 0
X u nh t n(n-1)/2 3n(n-1)/2

4.3.2. S p x p ki u chèn (Insertion Sort)


v Gi i thu t:
Gi s có m t dãy a1, a2,...,an trong ó iph n t u tiên a1, a2,...,ai-1 ã có th t .
Ý t ng chính c a gi i thu t s p x p b ng ph ng pháp chèn tr c ti p là tìm cách chèn
ph n t ai vào v trí thích h p c a n ã c s p có dãy m i a1, a2,...,ai tr nên có
th t . V trí này chính là v trí gi a hai ph n t ak-1 và ak th a ak-1 ? ai < ak (1?k?i).
Cho dãy ban u a1, a2,...,an, ta có th xem nh ã có o n g m m t ph n t a1 ã c
s p, sau ó thêm a2 vào o n a1 s có n a1 a2 c s p; ti p t c thêm a3 vào o n a1
a2 có n a1 a2 a3 c s p; ti p t c cho n khi thêm xong aN vào o n a1
a2...aN-1 s có dãy a1 a2.... aN c s p. Các b c ti n hành nh sau:
B c 1 (Input): Nh p m ng a.
c 2: i = 2; // gi s có n a[1] ã c s p.
c 3: x = a[i];
Tìm v trí pos thích h p trong o n a[1] n a[i-1] chèn a[i] vào
c 4: D i ch các ph n t t a[pos] n a[i-1] sang ph i 1 v trí
dành ch cho a[i]
c 5: a[pos] = x; // có o n a[1]..a[i] ã cs p
c 6: i = i+1;
− N ui n: L p l i B c 3.
− Ng c l i: D ng.
c 7 (Output): In ra k t qu . K t thúc thu t toán.
Ví d : Cho dãy s a: 12 2 8 5 1 6 4 15

Ch ng 4. Tìm ki m và s p x p Trang 32
u trúc d li u và gi i thu t

v Cài t:
Cài t thu t toán s p x p chèn tr c ti p thành hàm InsertionSort
void InsertionSort(int a[], int N ) {
int pos, i;
int x; //l u giá tr a[i] tránh b ghi è khi d i ch các ph n t .
for (int i=1 ; i<N ; i++) { // o n a[0] ã s p
x = a[i];
pos = i-1; // tìm v trí chèn x
while ((pos >= 0)&&(a[pos] > x)) { // k t h p d i ch các ph n t s
ng sau x trong dãy m i
a[pos+1] = a[pos];
pos--;
}
a[pos+1] = x; // chèn x vào dãy
Ch ng 4. Tìm ki m và s p x p Trang 33
u trúc d li u và gi i thu t
}
}
v Nh n xét:
Khi tìm v trí thích h p chèn a[i] vào o n a[0] n a[i-1], do o n ã c s p,
nên có th s d ng gi i thu t tìm nh phân th c hi n vi c tìm v trí pos, khi ó có gi i
thu t s p x p chèn nh phân:
void BInsertionSort(int a[], int N ) {
int l,r,m,i;
int x; //l u giá tr a[i] tránh b ghi è khi d i ch các ph n t .
for(int i=1 ; i<N ; i++) {
x = a[i]; l = 1; r = i-1;
while (i<=r) { // tìm v trí chèn x
m = (l+r)/2; // tìm v trí thích h p m
if(x < a[m]) r = m -1;
else l = m +1;
}
for(int j = i-1 ; j >=l ; j--)
a[j+1] = a[j]; // d i các ph n t s ng sau x
a[l] = x; // chèn x vào dãy
}
}
v ánh giá gi i thu t:
Ð i v i gi i thu t chèn tr c ti p, các phép so sánh x y ra trong m i vòng l p while
tìm v trí thích h p pos, và m i l n xác nh v trí ang xét không thích h p, s d i ch
ph n t a[pos] t ng ng. Gi i thu t th c hi n t t c N-1 vòng l p while, do s l ng
phép so sánh và d i ch này ph thu c vào tình tr ng c a dãy s ban u, nên ch có th
c l c trong t ng tr ng h p nh sau:
Tr ng h p S l n so sánh S l n hoán v
T t nh t n-1 2(n-1)
X u nh t n(n-1)/2 n(n+1)/2 -1

4.3.3. S p x p i ch tr c ti p (Interchange Sort)


v Gi i thu t:
Nh ã c p u ph n này, s p x p m t dãy s , ta có th xét các ngh ch th
có trong dãy và làm tri t tiêu d n chúng i. Ý t ng chính c a gi i thu t là xu t phát t
u dãy, tìm t t c ngh ch th ch a ph n t này, tri t tiêu chúng b ng cách i ch ph n
t này v i ph n t t ng ng trong c p ngh ch th . L p l i x lý trên v i các ph n t ti p
theo trong dãy. Các b c ti n hành nh sau:
Ch ng 4. Tìm ki m và s p x p Trang 34
u trúc d li u và gi i thu t
B c 1 (Input): Nh p m ng a.
c 2: i = 1;// b t ut u dãy.
c 3: j = i+1;//tìm các ph n t a[j] < a[i], j>i
Tìm v trí pos thích h p trong n a[1] n a[i-1] chèn a[i] vào
c 4:
− Trong khi j N th c hi n
− N u a[j]<a[i]: a[i]hoán v a[j]; //xét c p a[i], a[j]
− j = j+1;
c 5: a[pos] = x; // có o n a[1]..a[i] ã cs p
c 6: i = i+1;
− N ui n: L p l i B c 3.
− Ng c l i: D ng.
c 7 (Output): In ra k t qu . K t thúc thu t toán.
Ví d : Cho dãy s a: 12 2 8 5 1 6 4 15

Ch ng 4. Tìm ki m và s p x p Trang 35
u trúc d li u và gi i thu t

Ch ng 4. Tìm ki m và s p x p Trang 36
u trúc d li u và gi i thu t

v Cài t:
Cài t thu t toán s p x p theo ki u i ch tr c ti p thành hàm InterchangeSort:
void InterchangeSort(int a[], int N ) {
int i, j;
for (i = 0 ; i<N-1 ; i++)
for (j =i+1; j < N ; j++)
if(a[j ]< a[i]) // n u có s sai v trí thì i ch
Hoanvi(a[i],a[j]);
}
v Ðánh giá gi i thu t
Ð i v i gi i thu t i ch tr c ti p, s l ng các phép so sánh x y ra không ph
thu c vào tình tr ng c a dãy s ban u, nh ng s l ng phép hoán v th c hi n tùy
thu c vào k t q a so sánh, có th c l c trong t ng tr ng h p nh sau:
Tr ng h p S l n so sánh S l n hoán v
T t nh t n(n-1)/2 0
X u nh t n(n-1)/2 n(n-1)/2

4.3.4. S p x p n i b t (Bubble Sort)


v Gi i thu t:
Ý t ng chính c a gi i thu t là xu t phát t cu i ( u) dãy, i ch các c p ph n t
k c n a ph n t nh (l n) h n trong c p ph n t ó v v trí úng u (cu i) dãy
hi n hành, sau ó s không xét n nó b c ti p theo, do v y l n x lý th i s có v
trí u dãy là i. L p l i x lý trên cho n khi không còn c p ph n t nào xét. Các
c ti n hành nh sau: .
B c 1 (Input): Nh p m ng a.
c 2: i = 1; // b t u t ph n t u tiên c a m ng.
c 3: j = N; // duy t t cu i dãy ng c v v trí i
− Trong khi (j < i) th c hi n:
− N u a[j]<a[j-1]: Hoán v a[j] và a[j-1]; //xét c p ph n t k c n
− j = j-1;
c 4: i = i+1; // l n x lý k ti p
Ch ng 4. Tìm ki m và s p x p Trang 37
u trúc d li u và gi i thu t
− N u i > N-1: H t dãy. D ng
− Ng c l i: L p l i B c 2.
c 5 (Output): In ra k t qu . K t thúc thu t toán.
Ví d : Cho dãy s a: 12 2 8 5 1 6 4 15

Ch ng 4. Tìm ki m và s p x p Trang 38
u trúc d li u và gi i thu t

v Cài t
Cài t thu t toán s p x p theo ki u n i b t thành hàm BubbleSort:
void BubleSort(int a[], int N ) {
int i, j; // ch s ph n t nh nh t trong dãy hi n hành
for (i = 0 ; i<N-1 ; i++)
for (j =N-1; j >i ; j --)
if(a[j]< a[j-1]) // n u sai v trí thì i ch
Hoanvi(a[j], a[j-1]);
}
v Ðánh giá gi i thu t

Ch ng 4. Tìm ki m và s p x p Trang 39
u trúc d li u và gi i thu t
Ð i v i gi i thu t n i b t, s l ng các phép so sánh x y ra không ph thu c vào
tình tr ng c a dãy s ban u, nh ng s l ng phép hoán v th c hi n tùy thu c vào k t
q a so sánh, có th c l c trong t ng tr ng h p nh sau:
Tr ng h p S l n so sánh S l n hoán v
T t nh t n(n-1)/2 0
X u nh t n(n-1)/2 n(n-1)/2
v Nh n xét:
− BubbleSort có các khuy t m sau: không nh n di n c tình tr ng dãy ã có
th t hay có th t t ng ph n. Các ph n t nh c a v v trí úng r t
nhanh, trong khi các ph n t l n l i c a v v trí úng r t ch m.

4.3.5. S p x p chèn v i dài b c gi m d n (Shell Sort)


v Gi i thu t:
Gi i thu t ShellSort là m t ph ng pháp c i ti n c a ph ng pháp chèn tr c ti p. Ý
ng c a ph ng pháp s p x p là phân chia dãy ban u thành nh ng dãy con g m các
ph n t cách nhau h v trí:
Dãy ban u: a1, a2,..., an c xem nh s xen k c a các dãy con sau:
Dãy con th nh t: a1 ah+1 a2h+1...
Dãy con th hai: a2 ah+2 a2h+2...
....
Dãy con th h: ah a2h a3h...
Ti n hành s p x p các ph n t trong cùng dãy con s làm cho các ph n t c a
v v trí úng t ng i (ch úng trong dãy con, so v i toàn b các ph n t trong dãy
ban u có th ch a úng) m t cách nhanh chóng, sau ó gi m kho ng cách h t o
thành các dãy con m i (t o u ki n so sánh m t ph n t v i nhi u ph n t khác
tr c ó không cùng dãy con v i nó) và l i ti p t c s p x p... Thu t toán d ng khi h =
1, lúc này b o m t t c các ph n t trong dãy ban u s c so sánh v i nhau xác
nh tr t t úng cu i cùng.
Y u t quy t nh tính hi u qu c a thu t toán là cách ch n kho ng cách h trong
t ng b c s p x p và s b c s p x p. Gi s quy t nh s p x p k b c, các kho ng
cách ch n ph i th a u ki n:
hi > hi+1 và hk = 1
Tuy nhiên n nay v n ch a có tiêu chu n rõ ràng trong vi c l a ch n dãy giá tr
kho ng cách t t nh t, m t s dãy c Knuth ngh :
hi = (hi-1 - 1)/3 và hk = 1, k = log3n-1
Ví du: 127, 40, 13, 4, 1
Hay hi = (hi-1 - 1)/2 và hk = 1, k = log2n-1

Ch ng 4. Tìm ki m và s p x p Trang 40
u trúc d li u và gi i thu t
Ví d : 15, 7, 3, 1
Các b c ti n hành nh sau:
B c 1 (Input): Nh p m ng a.
c 2: Ch n k kho ng cách h[1], h[2],..., h[k]; i = 1;
c 3: Phân chia dãy ban u thành các dãy con cách nhau h[i] kho ng cách.
S p x p t ng dãy con b ng ph ng pháp chèn tr c ti p;
c 4: i = i+1;
− N u i > k: D ng
− Ng c l i: L p l i B c 3.
c 5 (Output): In ra k t qu . K t thúc thu t toán.
Ví d : Cho dãy s a: 12 2 8 5 1 6 4 15
Gi s ch n các kho ng cách là 5, 3, 1
h = 5: xem dãy ban u nh các dãy con

h = 3: (sau khi ã s p x p các dãy con b c tr c)

h = 1: (sau khi ã s p x p các dãy con b c tr c)

v Cài t

Ch ng 4. Tìm ki m và s p x p Trang 41
u trúc d li u và gi i thu t
Gi s ã ch n c dãy dài h[1], h[2],..., h[k], thu t toán ShellSort có th c
cài t nh sau:
void ShellSort(int a[], int N, int h[], int k) {
int step,i,j;
int x,len;
for (step = 0 ; step <k; step ++) {
len = h[step];
for (i = len; i <N; i++) {
x = a[i];
j = i-len; // a[j] ng k tr c a[i] trong cùng dãy con
while ((x<a[j])&&(j>=0) { // s p x p dãy con ch a x b ng
ph ng pháp chèn tr c ti p
a[j+len] = a[j];
j = j - len;
}
a[j+len] = x;
}
}
}
v Ðánh giá gi i thu t
Hi n nay vi c ánh giá gi i thu t Shellsort d n n nh ng v n toán h c r t ph c
t p, th m chí m t s ch a c ch ng minh. Tuy nhiên hi u qu c a thu t toán còn ph
thu c vào dãy các dài c ch n. Trong tr ng h p ch n dãy dài theo công th c
hi = (hi-1- 1)/2 và hk = 1, k = log2-1 thì gi i thu t có ph c t p = n << n2.
1.2

4.3.6. S p x p ki u phân n (Quick Sort)


Ð s p x p dãy a1, a2, ..., an gi i thu t QuickSort d a trên vi c phân ho ch dãy
ban u thành hai ph n :
Dãy con 1: G m các ph n t a1.. ai có giá tr không l n h n x
Dãy con 2: G m các ph n t ai .. an có giá tr không nh h n x
V i x là giá tr c a m t ph n t tùy ý trong dãy ban u. Sau khi th c hi n phân
ho ch, dãy ban u c phân thành 3 ph n:
1. ak < x , v i k = 1..i
2. ak = x , v i k = i..j
3. ak > x , v i k = j..N

Ch ng 4. Tìm ki m và s p x p Trang 42
u trúc d li u và gi i thu t
Trong ó dãy con th 2 ã có th t , n u các dãy con 1 và 3 ch có 1 ph n t thì
chúng c ng ã có th t , khi ó dãy ban u ã c s p. Ng c l i, n u các dãy con 1
và 3 có nhi u h n 1 ph n t thì dãy ban u ch có th t khi các dãy con 1, 3 c s p.
Ð s p x p dãy con 1 và 3, ta l n l t ti n hành vi c phân ho ch t ng dãy con theo cùng
ph ng pháp phân ho ch dãy ban u v a trình bày .
Gi i thu t phân ho ch dãy al, al+1, ., ar thành 2 dãy con:
B c 1: Ch n tùy ý m t ph n t a[k] trong dãy là giá tr m c, l ≤ k ≤ r:
x = a[k]; i = l; j = r;
c 2: Phát hi n và hi u ch nh c p ph n t a[i], a[j] n m sai ch :
− Trong khi (a[i]<x) i++;
− Trong khi (a[j]>x) j--;
− N u i< j Hoán v (a[i],a[j]); // a[i] ≥ x ≥ a[j] mà a[j] ng sau a[i]
c 3:
− N u i < j: L pl iB c 2.//ch a xét h t m ng
− N u i ≥ j: D ng
Có th phát bi u gi i thu t s p x p QuickSort m t cách qui nh sau :
c 1: Phân ho ch dãy al . ar thành các dãy con :
− Dãy con 1 : al.. aj ≤ x
− Dãy con 2 : aj+1.. ai-1 = x
− Dãy con 3 : ai.. ar > x
c 2:
− N u ( l < j ) Phân ho ch dãy al.. aj // dãy con 1 có nhi u h n 1 ph n t
− N u ( i < r ) Phân ho ch dãy ai.. ar // dãy con 3 có nhi u h n 1 ph n t
Thu t toán QuickSort có th c cài t qui nh sau :
void QuickSort(int a[], int l, int r) {
int i,j;
int x;
x = a[(l+r)/2]; // ch n ph n t gi a làm giá tr m c
i =l; j = r;
do {
while(a[i] < x) i++;
while(a[j] > x) j--;
if(i <= j) {
Hoanvi(a[i],a[j]);
i++ ; j--;
}
Ch ng 4. Tìm ki m và s p x p Trang 43
u trúc d li u và gi i thu t
} while(i < j);
if(l < j)
QuickSort(a,l,j);
if(i < r)
QuickSort(a,i,r);
}

v Ðánh giá gi i thu t


Hi u q a th c hi n c a gi i thu t QuickSort ph thu c vào vi c ch n giá tr m c.
Tr ng h p t t nh t x y ra n u m i l n phân ho ch u ch n c ph n t median (ph n
t l n h n (hay b ng) n a s ph n t , và nh h n (hay b ng) n a s ph n t còn l i) làm
m c, khi ó dãy c phân chia thành 2 ph n b ng nhau và c n log2(n) l n phân ho ch
thì s p x p xong. Nh ng n u m i l n phân ho ch l i ch n nh m ph n t có giá tr c c
i (hay c c ti u) là m c, dãy s b phân chia thành 2 ph n không u: m t ph n ch có 1
ph n t , ph n còn l i g m (n-1) ph n t , do v y c n phân ho ch n l n m i s p x p xong.
Ta có b ng t ng k t
Tr ng h p Ð ph c t p
T t nh t n*log(n)
Trung bình n*log(n)
X u nh t n2

4.4. ánh giá, nh n xét


Các thu t toán s p x p có th c so sánh v i nhau d a trên các y u t sau ây:
v Th i gian th c hi n (run-time): s các thao tác th c hi n (th ng là s các
phép so sánh và hoán i các b n ghi).
v B nh s d ng (Memory): là dung l ng b nh c n thi t th c hi n
thu t toán ngoài dung l ng b nh s d ng ch a d li u c n s p x p.
− M t vài thu t toán thu c lo i “in place” và không c n (ho c c n m t s c
nh) thêm b nh cho vi c th c hi n thu t toán.
− Các thu t toán khác th ng s d ng thêm b nh t l thu n theo hàm
tuy n tính ho c hàm m v i kích th c file s p x p.
− T t nhiên là b nh s d ng càng nh càng t t m c dù vi c cân i gi a
th i gian và b nh c n thi t có th là có l i.
v S n nh (Stability):M t thu t toán c g i là n nh n u nh nó có th
gi c quan h th t c a các khóa b ng nhau (không làm thay i th t
c a các khóa b ng nhau).
Chúng ta th ng lo l ng nhi u nh t là v th i gian th c hi n c a thu t toán vì các
thu t toán mà chúng ta bàn v th ng s d ng kích th c b nh t ng ng nhau .

Ch ng 4. Tìm ki m và s p x p Trang 44
u trúc d li u và gi i thu t
Bài t p
1. Cài t các thu t toán tìm ki m ã trình bày. Th hi n tr c quan các thao tác c a
thu t toán. Tính th i gian th c hi n c a m i thu t toán.
2. Hãy vi t hàm tìm t t c các s nguyên t n m trong m ng m t chi u a có n ph n t .
3. Hãy vi t hàm tìm dãy con t ng dài nh t c a m ng m t chi u a có n ph n t (dãy
con là m t dãy liên ti p các ph n c a a).
4. Cài t các thu t toán s p x p ã trình bày. Th hi n tr c quan các thao tác c a
thu t toán. Tính th i gian th c hi n c a m i thu t toán.
5. Cho dãy s 5 1 2 8 4 7 0 12 4 3 24 1 4, hãy minh ho k t q a s p x p dãy s này
t ng b c v i các gi i thu t ch n tr c ti p, chèn tr c ti p, n i b t
6. Cài t ch c n ng in b ng l ng nhân viên theo th t ti n l ng t ng d n (d li u
c mô t trong bài t p 5- ch ng 1).

Ch ng 4. Tìm ki m và s p x p Trang 45

You might also like