Professional Documents
Culture Documents
=
45 96
45 115
40
96 115 40
3 A
Hnh 6.6 Biu din th c trng s bng ma trn k
u im ca phng php biu din th bng ma trn k l ta c th d dng bit c
c mt cnh ni 2 nh v
i
, v
j
hay khng v c trng s bao nhiu. Tuy nhin, phng php ny c
nhc im l kch thc ma trn k lun lun l n x n bt k th c bao nhiu cnh.
6.2.2 Biu din th bng danh sch k
R rng l i vi cc th c s cnh t th vic s dng ma trn k biu din th
gy ra lng ph khng gian nh. Trong trng hp ny, ngi ta thng s dng phng php
danh sch k biu din th.
b a
d c
v
0
= a, v
1
= b
v
2
= c, v
3
= d
H Ni
Bc Ninh
Thi Bnh
115km
40km
Ninh Bnh
96km
45km
v
0
= H Ni, v
1
= Bc Ninh, v
2
= Thi Bnh, v
3
= Ninh Bnh
81
Phng php ny s dng mt danh sch lin kt cho mi nh ca th. Danh sch lin
kt ca mt nh s cha cc nh khc k vi n, do vy cc danh sch ny c gi l cc danh
sch k.
V d, vi th c hng nh hnh 6.1, cc danh sch k ca n l:
Cn vi th v hng nh hnh 6.2, cc danh sch k ca n l:
Hnh 6.7 Biu din th bng danh sch k
6.3 DUYT TH
Duyt th l hnh ng thm tt c cc nh ca th, mi nh ng 1 ln, theo mt
trnh t no . Tng t nh duyt cy, c nhiu phng php duyt th ty theo trnh t
thm cc nt trong qu trnh duyt. Tuy nhin, c 2 phng php duyt ph bin nht l duyt
theo chiu su v duyt theo chiu rng.
6.3.1 Duyt theo chiu su
Qu trnh duyt theo chiu su bt u t mt nh no ca th. Sau khi thm nh
ny, qu trnh duyt theo chiu su c lp li vi tt c cc nh k ca n. Tuy nhin, th c
th tn ti cc chu trnh, do vy, ta cn phi nh du cc nh duyt trnh duyt li nh
ny mt ln na.
Vi trnh t duyt nh trn, qu trnh duyt s duyt ht mt nhnh ca th ri mi
sang nhnh khc. Do vy, phng php duyt ny c gi l duyt theo chiu su.
Hnh 6.8 Duyt th theo chiu su
a
b
c
d
a
b
c
d
b a
d c
b
NULL
c
d NULL
b NULL
d NULL
b a
d c
b a
d c
b
NULL
c
a NULL
a
NULL
b NULL
c d
b
82
V d, vi th trn, qu trnh duyt theo chiu su bt u t nh a s cho th t duyt
nh sau:
- Sau khi thm nh a, tin hnh thm nh k vi a l b. Tip theo thm nh k b l d.
nh d khng k nh no, do vy quay li bc trc.
- nh b ch c 1 nh k l d thm, do vy quay tr li bc trc.
- nh a cn nh k l c cha thm, do vy tin hnh thm nh ny.
Nh vy, th t cc nh trong qa trnh duyt l: a, b, d, c
Qu trnh duyt s ch duyt theo cc cnh dn ti cc nh cha thm. Cc cnh dn ti cc
nh thm ri s c b qua. Chng hn, trong qu trnh duyt th trn, khi duyt n nh c,
cnh ni ti b s c b qua v nh b c thm ri.
Ci t phng php duyt theo chiu su nh sau:
kim tra vic duyt mi nh ng mt ln, chng ta s dng mt mng daxet gm n
phn t (tng ng vi n nh). Nu nh th i c duyt, daxet[i]=1, ngc li, daxet[i]=0.
Thut ton tm kim theo chiu su bt u t nh v no s duyt tt c cc nh lin thng
vi v. Thut ton c th c m t bng th tc qui DeepFirstSearch.
void DeepFirstSearch(int v){
Thm nh v;
daxet[v] = 1;
for mi nh u k vi v {
if (daxet[u]=0 )
DeepFirstSearch(v);
}
}
Th tc DeepFirstSearch s thm tt c cc nh cng thnh phn lin thng vi v mi nh
ng mt ln. m bo duyt tt c cc nh ca th (c th c nhiu thnh phn lin
thng), chng ta ch cn thc hin :
for( i=1; in; i++)
daxet[i] = 0;
for( i:=1;i n; i++)
if (daxet[i]=0)
DeepFirstSearch(i);
6.3.2 Duyt theo chiu rng
Qu trnh duyt theo chiu rng cng bt u t mt nh no ca th. Tip n, cc
nh k ca n s c thm, ri tip tc n cc nh k ca cc nh va thm .v.v.
Nh vy, qu trnh duyt theo chiu rng khng duyt theo tng nhnh ca th m
duyt theo su ca cc nh so vi nh ban u. T nh bt u, cc nh c khong cch vi
nh ban u l 1 c duyt, tip n l cc nh c khong cch 2, v.v.
83
Hnh 6.9 Duyt th theo chiu rng
V d, vn vi th nh phn trc, qu trnh duyt theo chiu rng vi nh bt u l a
s cho th t duyt nh sau:
- Sau khi thm nh a, tin hnh thm cc nh k vi a l b v c.
- Tip theo, thm cc nh k vi b l d.
- nh k vi c l b c thm ri nn b qua.
Nh vy, th t cc nh c thm l: a, b, c, d.
Duyt theo chiu rng c th c ci t khng qui bng cch s dng hng i lu
cc nh cn c thm. Cc bc nh sau:
u tin, a nh bt u v vo hng i, sau lp li qu trnh sau cho n khi hng i
khng cn phn t no:
- Ly phn t ra khi hng i, a vo bin v.
- Thm nh v.
- Vi mi nh k vi v, nu nh ny cha c thm th a vo hng i.
V d, i vi th hnh trn, cc bc thc hin nh sau:
u tin, a nh a vo hng i.
- Ly nh a ra khi hng i, thm nh a.
- a 2 nh k vi a l b v c vo hng i.
- Ly nh b ra khi hng i, thm nh b
- a nh k vi b l d vo hng i
- Ly nh c ra khi hng i, thm nh c
b a
d c
a
b c
c
c d
d
84
- nh k vi c l b thm, v vy khng a vo hng i. Ly nh d ra khi hng i,
thm nh d.
- Hng i ht phn t, qu trnh duyt kt thc. Th t thm cc nh l: a, b, c, d
Ci t cho thun ton duyt theo chiu rng nh sau:
void BreadthFirstSearch(int v){
queue = ;
a v vo hng i;
daxet[v] = 1;
while (queue ){
Ly phn t ra khi hng i, a vo bin u;
Thm nh u;
for mi nh w k vi u {
if (daxet[w]=0 ) {
a w vo hng i;
daxet[w] = 1;
}
}
}
Tng t nh duyt theo chiu su, th tc BreadthFirstSearch s thm tt c cc nh cng
thnh phn lin thng vi v. thm tt c cc nh ca th, chng ta ch cn thc hin:
for( v=1; vn; v++)
daxet[v] = 0;
for(v=1; vn; v++)
if (daxet[v]=0)
BreadthFirstSearch(u);
6.3.3 ng dng duyt th kim tra tnh lin thng
Nh ni trn, duyt th (theo chiu rng hay theo chiu su) s thm tt c cc nh
cng thnh phn lin thng vi nh bt u duyt. V vy, ta c th s dng th tc duyt th
kim tra tnh lin thng ca th, hoc thm ch c th m c s thnh phn lin thng
ca th.
lm c iu ny, ta thc hin duyt t u n cui danh sch cc nh ca th. Ti
mi bc, ta kim tra nu nh cha c thm th ta tin hnh gi th tc duyt th cho nh
ny. Nh vy, nu th lin thng hon ton th ch mt mt ln gi th tc duyt cho nh u
tin. Ngc li, s ln gi th tc duyt chnh l s thnh phn lin thng ca th.
int lt=0;
for( v=1; vn; v++)
daxet[v] = 0;
for(v=1; vn; v++)
if (daxet[v]=0){
85
BreadthFirstSearch(u);
lt++;
}
if (lt ==1) printf(Do thi lien thong!);
else printf(Do thi khong lien thong, so thanh phan lien thong
la %d, lt);
6.4 TM TT CHNG 6
- Khi nim th c hng:
th c hng G = <V, E> bao gm:
(1) V l mt tp hu hn cc nh.
(2) E l mt tp hu hn, c th t cc cp nh ca V, gi l cc cnh.
- Khi nim th v hng:
th v hng G = <V, E> bao gm:
(1) V l mt tp hu hn cc nh.
(2) E l mt tp hu hn cc cp nh phn bit ca V, gi l cc cnh.
- th c th c biu din bng ma trn k hoc danh sch k.
- th biu din bng ma trn k A c tnh cht: Phn t hng i, ct j ca ma trn A
c gi tr 1 khi c mt cnh ni t v
i
n v
j
. Ngc li, phn t c gi tr 0.
- Biu din th bng danh sch k: S dng mt danh sch lin kt cho mi nh ca
th. Danh sch lin kt ca mt nh s cha cc nh khc k vi n
- Duyt theo chiu su bt u t mt nh no ca th. Sau khi thm nh ny, qu
trnh duyt theo chiu su c lp li vi tt c cc nh k ca n.
- Duyt theo chiu rng cng bt u t mt nh no ca th. Tip n, cc nh k
ca n s c thm, ri tip tc n cc nh k ca cc nh va thm .v.v.
6.5 CU HI V BI TP
1. Cho bit biu din bng ma trn k v danh sch k ca th bn di:
2. Cho bit ma trn k ca th trng s sau:
2
9
4
7
a
b
c
d
e
5
b a
d c
86
3. Vi th cu 1, cho bit trnh t thm cc nh khi thc hin duyt theo chiu su bt
u t nh a.
4. Vi th cu 2, cho bit trnh t thm cc nh khi thc hin duyt theo chiu rng bt
u t nh a.
5. Cho bit s thnh phn lin thng ca th bn di.
a
b
c
d
e
87
CHNG 7
SP XP V TM KIM
Sp xp v tm kim l cc vn rt c bn trong tin hc cng nh trong thc tin.
Chng 7 gii thiu cc phng php sp xp v tm kim thng dng nht, bao gm cc gii
thut t n gin n phc tp.
i vi cc gii thut sp xp, cc phng php sp xp n gin c trnh by bao gm:
sp xp chn, sp xp chn, sp xp ni bt. Cc phng php sp xp phc tp v hiu qu hn
c xem xt l gii thut sp xp nhanh (quick sort), sp xp vun ng (heap sort) v sp xp
trn (merge sort). Vi mi phng php sp xp, ngoi vic trnh by cc bc thc hin thut
ton, phc tp ca gii thut cng c tnh ton v nh gi.
i vi cc phng php tm kim, ngoi phng php tm kim tun t n gin, cc
phng php tm kim phc tp v hiu qu hn cng c xem xt l tm kim nh phn v tm
kim bng cy nh phn tm kim.
hc tt chng ny, sinh vin cn nghin cu k cc bc thc hin cc thut ton v
ly v d c th, sau thc hin tng bc trn v d.
7.1 BI TON SP XP
Sp xp l qu trnh b tr li cc phn t ca 1 tp hp theo th t no . Mc ch chnh
ca sp xp l lm cho thao tc tm kim phn t trn tp c d dng hn. V d v tp cc
i tng c sp ph bin trong thc t l: danh b in thoi c sp theo tn, cc t trong t
in c sp theo vn, sch trong th vin c sp theo m s, theo tn, .v.v.
Nhn chung, c rt nhiu thao tc x l d liu cn n vic sp xp cc phn t d liu
theo trnh t no . Trn thc t, sp xp l mt thao tc kh n gin. Tuy nhin, nh chng ta
s thy, c rt nhiu gii thut sp xp khc nhau, t n gin ti phc tp. V cc k thut c
s dng trong cc gii thut sp xp ny c nghin cu v phn tch nhiu hn l chnh bn
thn gii thut sp xp. Cc k thut ny c coi l c s xy dng nhiu gii thut quan
trng khc. Do , cc thut ton sp xp c trnh by v phn tch k trong hu ht cc ti liu
v gii thut.
Cc gii thut sp xp cn l mt v d in hnh cho s a dng ca thut ton. Cng mt
mc ch, nhng c rt nhiu cch thc hin, mi cch ti u trn mt kha cnh no , v c
mt s cch sp xp c nhiu u im hn nhng cch khc. Do , sp xp cng c s dng
nh mt v d in hnh trong vic phn tch thut ton.
Thng thng, cc gii thut sp xp c chia lm 2 loi. Loi th nht l cc gii thut
c ci t n gin, nhng khng hiu qu (phi s dng nhiu thao tc). Loi th hai l cc
gii thut c ci t phc tp, nhng hiu qu hn v mt tc (dng t thao tc hn). i vi
cc tp d liu t phn t, tt nht l nn la chn loi th nht. i vi tp c nhiu phn t, loi
th hai s mang li hiu qu hn.
Cc i tng d liu cn sp xp thng c nhiu thuc tnh, v ta cn chn mt thuc
tnh lm kha sp xp d liu theo kha ny. V d, i tng v ngi thng c cc thuc
88
tnh c bn nh h tn, ngy sinh, gii tnh, v.v., tuy nhin h tn thng c chn lm kha
sp xp.
Tham s tnh ton hiu qu ca gii thut thng l thi gian thc hin. i vi cc
phng php sp xp n gin, thi gian thc hin (s thao tc thc hin) t l vi N
2
, trong N
l s phn t ca tp. Cc gii thut sp xp phc tp v tinh xo hn c thi gian thc hin t l
vi NlogN. Ngi ta chng mnh c rng, khng c gii thut no c th c thi gian thc hin
nh hn NlogN. Ngoi thi gian thc hin, dung lng b nh b chim cng l mt tham s
nh gi tnh hiu qu ca gii thut.
Mt vn na cn phi ch khi thc hin sp xp, l tnh n nh ca gii thut sp
xp. Mt gii thut c gi l n nh nu sau khi sp xp, n gi nguyn v tr ca cc phn t
c cng gi tr kha. Chng hn, vi danh sch theo vn h tn cc sinh vin trong mt lp. Nu
ta tin hnh sp danh sch ny theo im, th cc sinh vin c cng im vn c sp theo vn
h tn. Hu ht cc gii thut sp xp n gin c tnh n nh, trong khi cc gii thut tinh xo
hn li khng c tnh cht ny.
7.2 CC GII THUT SP XP N GIN
7.2.1 Sp xp chn
y l mt trong nhng gii thut sp xp n gin nht. tng ca gii thut nh sau:
La chn phn t c gi tr nh nht, i ch cho phn t u tin. Tip theo, la chn phn
t c gi tr nh th nh, i ch cho phn t th 2. Qu trnh tip tc cho ti khi ton b dy
c sp.
V d, cc bc thc hin sp xp chn dy s bn di nh sau:
32 17 49 98 06 25 53 61
Bc 1: Chn c phn t nh nht l 06, i ch cho 32.
06 17 49 98 32 25 53 61
Bc 2: Chn c phn t nh th nh l 17, chnh l phn t th 2 nn gi nguyn.
06 17 49 98 32 25 53 61
Bc 3: Chn c phn t nh th ba l 25, i ch cho 49.
06 17 25 98 32 49 53 61
Bc 4: Chn c phn t nh th t l 32, i ch cho 98.
06 17 25 32 98 49 53 61
89
Bc 5: Chn c phn t nh th nm l 49, i ch cho 98.
06 17 25 32 49 98 53 61
Bc 6: Chn c phn t nh th su l 53, i ch cho 98.
06 17 25 32 49 53 98 61
Bc 7: Chn c phn t nh th by l 61, i ch cho 98.
06 17 25 32 49 53 61 98
Nh vy, ton b dy c sp.
Gii thut c gi l sp xp chn v ti mi bc, mt phn t c chn v i ch cho
phn t v tr cn thit trong dy.
Th tc thc hin sp xp chn trong C nh sau:
void selection_sort(){
int i, j, k, temp;
for (i = 0; i< N; i++){
k = i;
for (j = i+1; j < N; j++){
if (a[j] < a[k]) k = j;
}
temp = a[i]; a[i] =a [k]; a[k] = temp;
}
}
Trong th tc trn, vng lp u tin duyt t u n cui dy. Ti mi v tr i, tin hnh
duyt tip t i ti cui dy chn ra phn t nh th i v i ch cho phn t v tr i.
Thi gian thc hin thut ton t l vi N
2
, v vng lp ngoi (bin chy i) duyt qua N
phn t, v vng lp trong duyt trung bnh N/2 phn t. Do , phc tp trung bnh ca thut
ton l O(N * N/2) = O(N
2
/2) = O(N
2
).
7.2.2 Sp xp chn
Gii thut ny coi nh dy c chia lm 2 phn. Phn u l cc phn t c sp. T
phn t tip theo, chn n vo v tr thch hp ti na sp sao cho n vn c sp.
chn phn t vo na sp, ch cn dch chuyn cc phn t ln hn n sang tri 1 v
tr v a phn t ny vo v tr trng trong dy.
V d, na dy sp l:
90
06 17 49 98
chn phn t 32 vo na dy ny, ta tin hnh dch chuyn cc phn t ln hn 32 v
bn tri 1 v tr:
06 17 49 98
Sau , chn 32 vo v tr trng trong na dy:
06 17 32 49 98
Quay tr li vi dy s phn trc, cc bc thc hin sp xp chn trn dy nh sau:
Dy ban u: Na sp trng, na cha sp l ton b dy.
32 17 49 98 06 25 53 61
Bc 1: Chn phn t u ca na cha sp l 32 vo na sp. Do na sp l trng
nn c th chn vo v tr bt k.
32 17 49 98 06 25 53 61
Bc 2: Chn phn t 17 vo na sp. Dch chuyn 32 sang phi 1 v tr v a 17 vo
v tr trng.
17 32 49 98 06 25 53 61
Bc 3, 4: Ln lt chn phn t 49, 98 vo na sp.
17 32 49 98 06 25 53 61
Bc 5: Chn phn t 06 vo na sp. Dch chuyn cc phn t 17, 32, 49, 98 sang
phi 1 v tr v a 06 vo v tr trng.
06 17 32 49 98 25 53 61
sp
Cha sp
sp
Cha sp
sp
Cha sp
sp
Cha sp
91
Bc 6: Chn phn t 25 vo na sp. Dch chuyn cc phn t 32, 49, 98 sang phi 1
v tr v a 25 vo v tr trng.
06 17 25 32 49 98 53 61
Bc 7: Chn phn t 53 vo na sp. Dch chuyn phn t 98 sang phi 1 v tr v
a 53 vo v tr trng.
06 17 25 32 49 53 98 61
Bc 8: Chn phn t cui cng 61 vo na sp. Dch chuyn phn t 98 sang phi 1
v tr v a 61 vo v tr trng.
06 17 25 32 49 53 61 98
Th tc thc hin sp xp chn trong C nh sau:
void insertion_sort(){
int i, j, k, temp;
for (i = 1; i< N; i++){
temp = a[i];
j=i-1;
while ((a[j] > temp)&&(j>=0)) {
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
}
Thut ton s dng 2 vng lp. Vng lp ngoi duyt khong N ln, v vng lp trong
duyt trung bnh N/4 ln (gi s duyt n gia na sp th gp v tr cn chn). Do ,
phc tp trung bnh ca thut ton l O(N
2
/4) = O(N
2
).
7.2.3 Sp xp ni bt
Gii thut sp xp ni bt c thc hin theo nguyn tc: Duyt nhiu ln t cui ln u
dy, tin hnh i ch 2 phn t lin tip nu chng ngc th t. n mt bc no , khi
khng c php i ch no xy ra th ton b dy c sp.
sp
Cha sp
sp
Cha sp
sp
92
Nh vy, sau ln duyt u tin, phn t nh nht ca dy s ln lt c i ch cho cc
phn t ln hn v ni ln u dy. Ln duyt th 2, phn t nh th 2 s ni ln v tr th nh
dy .v.v. Chu rng, khng nht thit phi tin hnh tt c N ln duyt, m ti mt ln duyt no
, nu khng cn php i ch no xy ra tc l tt c cc phn t nm ng th t v ton b
dy c sp.
Vi dy s nh phn trc, cc bc tin hnh gii thut sp xp ni bt trn dy nh
sau:
Bc 1: Ti bc ny, khi duyt t cui dy ln, ln lt xut hin cc cp ngc th t l
(06, 98), (06, 49), (06, 17), (06, 32). Phn t 06 ni ln u dy.
Bc 2: Duyt t cui dy ln, ln lt xut hin cc cp ngc th t l (25, 98), (25, 49),
(17, 32). Phn t 17 ni ln v tr th 2.
Bc 3: Duyt t cui dy ln, ln lt xut hin cc cp ngc th t l (53, 98), (25, 32).
Phn t 25 ni ln v tr th 3.
32
17
49
98
06
25
53
61
32
17
49
06
98
25
53
61
32
17
06
49
98
25
53
61
32
06
17
49
98
25
53
61
06
32
17
49
98
25
53
61
06
32
17
49
98
25
53
61
06
32
17
49
25
98
53
61
06
32
17
25
49
98
53
61
06
17
32
25
49
98
53
61
93
Bc 4: Duyt t cui dy ln, xut hin cp ngc th t l (61, 98).
Bc 5: Duyt t cui dy ln, khng cn xut hin cp ngc no. Ton b dy c
sp.
Th tc thc hin sp xp ni bt trong C nh sau:
void bubble_sort(){
int i, j, temp, no_exchange;
i = 1;
do{
no_exchange = 1;
for (j=n-1; j >= i; j--){
if (a[j-1] > a[j]){
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
no_exchange = 0;
}
}
06
17
32
25
49
98
53
61
06
17
32
25
49
53
98
61
06
17
25
32
49
53
98
61
06
17
25
32
49
53
98
61
06
17
25
32
49
53
61
98
94
i++;
} until (no_exchange || (i == n-1));
}
Ln duyt u tin cn khong N-1 php so snh v i ch lm ni phn t nh nht
ln u. Ln duyt th 2 cn khong N-2 php ton, .v.v. Tng cng, s php so snh cn thc
hin l:
(N-1) + (N-2) + + 2 + 1 = N(N-1)/2
Nh vy, phc tp cng gii thut sp xp ni bt cng l O(N
2
).
7.3 QUICK SORT
7.3.1 Gii thiu
Quick sort l mt thut ton sp xp c pht minh ln u bi C.A.Hoare vo nm 1960.
y c l l thut ton c nghin cu nhiu nht v c s dng rng ri nht trong lp cc
thut ton sp xp.
Quick sort l mt thut ton d ci t, hiu qu trong hu ht cc trng hp, v tiu tn t
ti nguyn hn so vi cc thut ton khc. phc tp trung bnh ca gii thut l O(NlogN).
Nhc im ca gii thut ny l phi ci t bng qui (c th khng dng qui, tuy nhin
ci t phc tp hn nhiu) v trong trng hp xu nht th phc tp l O(N
2
). Ngoi ra, ci
t cho Quick sort phi i hi cc k chnh xc. Ch cn mt sai st nh c th lm cho chng
trnh ngng hot ng.
K t khi Quick sort ra i ln u tin, c rt nhiu n lc nhm ci tin thut ton ny.
Tuy nhin, hu ht cc ci tin ny u khng mang li hiu qu nh mong i, v bn thn Quick
sort l mt thut ton rt cn bng. Mt s ci tin mt phn ny ca thut ton c th dn n
mt tc dng ngc li phn kia v lm cho thut ton tr nn mt cn bng.
tng c bn ca Quick sort da trn phng php chia tr nh trnh by trong
chng 2. Gii thut chia dy cn sp thnh 2 phn, sau thc hin vic sp xp cho mi phn
c lp vi nhau. thc hin iu ny, u tin chn ngu nhin 1 phn t no ca dy lm
kha. Trong bc tip theo, cc phn t nh hn kho phi c xp vo pha trc kho v cc
phn t ln hn c xp vo pha sau kho. c c s phn loi ny, cc phn t s c so
snh vi kho v hon i v tr cho nhau hoc cho kho nu n ln hn kha m li nm trc
hoc nh hn kho m li nm sau. Khi lt hon i u tin thc hin xong th dy c chia
thnh 2 on: 1 on bao gm cc phn t nh hn kho, on cn li bao gm cc phn t ln
hn kho.
95
Hnh 7.1 Quick sort
p dng k thut nh trn cho mi on v tip tc lm nh vy cho n khi mi on
ch cn 2 phn t. Khi ton b dy c sp.
7.3.2 Cc bc thc hin gii thut
chia dy thnh 2 phn tho mn yu cu nh trn, ta ly mt phn t ca dy lm kho
(chng hn phn t u tin). Tin hnh duyt t bn tri dy v dng li khi gp 1 phn t ln
hn hoc bng kho. ng thi tin hnh duyt t bn phi dy cho ti khi gp 1 phn t nh hn
hoc bng kho. R rng 2 phn t ny nm nhng v tr khng ph hp v chng cn phi c
i ch cho nhau. Tip tc qu trnh cho ti khi 2 bin duyt gp nhau, ta s chia c dy thnh
2 na: Na bn phi kho bao gm nhng phn t ln hn hoc bng kho v na bn tri l
nhng phn t nh hn hoc bng kho.
Ta hy xem xt qu trnh phn i dy s cho phn trc.
32 17 49 98 06 25 53 61
Chn phn t u tin ca dy, phn t 32, lm kho. Qu trnh duyt t bn tri vi bin
duyt i s dng li 49, v y l phn t ln hn kho. Qu trnh duyt t bn phi vi bin
duyt j s dng li 25 v y l phn t nh hn kho. Tin hnh i ch 2 phn t cho nhau.
32 17 25 98 06 49 53 61
Qu trnh duyt tip tc. Bin duyt i dng li 98, cn bin duyt j dng li 06. Li tin
hnh i v tr 2 phn t 98 v 06.
Kho i
j
Kho
96
32 17 25 06 98 49 53 61
Tip tc qu trnh duyt. Cc bin duyt i v j gp nhau v qu trnh duyt dng li.
32 17 25 06 98 49 53 61
Nh vy, dy c chia lm 2 na. Na u t phn t u tin n phn t th j, bao
gm cc phn t nh hn hoc bng kho. Na sau t phn t th i n phn t cui, bao gm cc
phn t ln hn hoc bng kho.
Qu trnh duyt v i ch c lp li vi 2 na dy va c to ra, v c tip tc nh
vy cho ti khi dy c sp hon ton.
7.3.3 Ci t gii thut
ci t gii thut, trc ht ta xy dng mt th tc sp mt phn on ca dy. Th
tc ny l 1 th tc qui, bao gm vic chia phn on thnh 2 on con tha mn yu cu trn,
sau thc hin li gi qui vi 2 on con va to c. Gi s phn on c gii hn bi 2
tham s l left v right cho bit ch s u v cui ca phn on, khi th tc c ci t nh
sau:
void quick(int left, int right) {
int i,j;
int x,y;
i=left; j=right;
x= a[left];
do {
while(a[i]<x && i<right) i++;
while(a[j]>x && j>left) j--;
if(i<=j){
y=a[i];a[i]=a[j];a[j]=y;
i++;j--;
}
}while (i<=j);
if (left<j) quick(left,j);
if (i<right) quick(i,right);
}
Tip theo, thc hin sp ton b dy, ta ch cn gi th tc trn vi tham s left l ch s
u v right l ch s cui ca mng.
Kho i
j
Kho j
i
97
void quick_sort(){
quick(0, n-1);
}
Nhc im ca Quick sort l hot ng rt km hiu qu trn nhng dy c sp sn.
Khi , cn phi mt N ln gi qui v mi ln ch loi c 1 phn t. Thi gian thc hin
thut ton trong trng hp xu nht ny l khong N
2
/2, c ngha l O(N
2
).
Trong trng hp tt nht, mi ln phn chia s c 2 na dy bng nhau, khi thi gian
thc hin thut ton T(N) s c tnh l:
T(N) = 2T(N/2) + N
Khi , T(N) NlogN.
Trong trng hp trung bnh, thut ton cng c phc tp khong 2NlogN = O(NlogN).
Nh vy, quick sort l thut ton rt hiu qu trong a s trng hp. Tuy nhin, i vi cc
trng hp vic sp xp ch phi thc hin mt vi ln v s lng d liu cc ln th nn thc thi
mt s thut ton khc c thi gian thc hin trong mi trng hp l O(NlogN), s xem xt
phn sau, m bo trng hp xu nht khng xy ra khi dng quick sort.
7.4 HEAP SORT
7.4.1 Gii thiu
Heap sort l mt gii thut m bo k c trong trng hp xu nht th thi gian thc hin
thut ton cng ch l O(NlogN).
tng c bn ca gii thut ny l thc hin sp xp thng qua vic to cc heap, trong
heap l 1 cy nh phn hon chnh c tnh cht l kha nt cha bao gi cng ln hn kha
cc nt con.
Vic thc hin gii thut ny c chia lm 2 giai on. u tin l vic to heap t dy
ban u. Theo nh ngha ca heap th nt cha bao gi cng ln hn cc nt con. Do vy, nt gc
ca heap bao gi cng l phn t ln nht.
Giai on th 2 l vic sp dy da trn heap to c. Do nt gc l nt ln nht nn n s
c chuyn v v tr cui cng ca dy v phn t cui cng s c thay vo gc ca heap. Khi
ta c 1 cy mi, khng phi heap, vi s nt c bt i 1. Li chuyn cy ny v heap v lp
li qu trnh cho ti khi heap ch cn 1 nt. chnh l phn t b nht ca dy v c t ln
u.
7.4.2 Cc thut ton trn heap
Nh vy, vic u tin cn lm l phi to c 1 heap t 1 dy phn t cho trc. lm
vic ny, cn thc hin thao tc chn 1 phn t vo 1 heap c. Khi , kch thc ca heap
tng ln 1, v ta t phn t mi vo cui heap. Vic ny c th lm vi phm nh ngha heap v
nt mi c th ln hn nt cha ca n. Vn ny c gii quyt bng cch i v tr nt mi
cho nt cha, v nu vn vi phm nh ngha heap th ta li gii quyt theo cch tng t cho n
khi c mt heap mi hon chnh.
Gi s ta c 1 heap nh sau:
98
chn phn t 61 vo heap, u tin, ta t n vo v tr cui cng trong cy.
R rng cy mi vi phm nh ngha heap v nt con 61 ln hn nt cha 17. Tin hnh i
v tr 2 nt ny cho nhau:
Cy ny vn tip tc vi phm nh ngha heap do nt con 61 ln hn nt cha 49. Li i v
tr 61 cho 49.
98
49
53
17
06 25
32
98
49
53
17
06 25
32
61
98
49
53
61
06 25
32
17
98
61
53
49
06 25
32
17
99
Do nt con 61 nh hn nt cha 98 nn cy tho mn nh ngha heap. Nh vy, ta c mt
heap vi nt mi c thm vo l 61.
chn mt phn t x vo 1 heap c k phn t, ta gn phn t th k +1, a[k], bng x, ri
gi th tc upheap(k).
void upheap(int m){
int x;
x=a[m];
while ((a[(m-1)/2]<=x) && (m>0)){
a[m]=a[(m-1)/2];
m=(m-1)/2;
}
a[m]=x;
}
void insert_heap(int x){
a[m]=x;
upheap(m);
m++;
}
Nh vy, vi heap ban u ch c 1 phn t l phn t u tin ca dy, ta ln lt ly cc
phn t tip theo ca dy chn vo heap s to c 1 heap gm ton b n phn t.
Ta hy xem xt qu trnh to heap vi dy s cho phn trc.
32 17 49 98 06 25 53 61
u tin, to 1 heap vi ch 1 phn t l 32:
Bc 1: Tin hnh chn 17 vo heap.
Do khng vi phm nh ngha heap nn khng thay i g.
Bc 2: Tin hnh chn 49 vo heap.
32
32
17
100
Cy ny vi phm nh ngha heap do 49>32 nn i v tr 32 v 49 cho nhau.
Cy mi tho mn nh ngha heap.
Bc 3: Tin hnh chn 98 vo heap.
Cy ny vi phm nh ngha heap do 98>17 nn i v tr 98 v 17 cho nhau.
Cy mi li vi phm nh ngha heap, do 98>49, nn i v tr 98 cho 49.
Cy ny tho mn nh ngha heap.
32
17
49
49
17
32
49
17
32
98
49
98
32
17
98
49
32
17
101
Bc 4: Tin hnh chn 06 vo heap.
Cy ny tho mn nh ngha heap do 06<49.
Bc 5: Tin hnh chn 25 vo heap.
Cy ny tho mn nh ngha heap do 25<32.
Bc 6: Tin hnh chn 53 vo heap.
Cy ny vi phm nh ngha heap do 53>32 nn i v tr 53 v 32 cho nhau.
Cy mi tho mn nh ngha heap.
98
49
32
17
06
98
49
32
17
06 25
98
49
32
17
06 25
53
98
49
53
17
06 25
32
102
Bc 7: Tin hnh chn 61 vo heap.
Cy ny vi phm nh ngha heap do 61>17 nn i v tr 61 v 17 cho nhau.
Cy mi tip tc vi phm nh ngha heap do 61>49 nn i v tr 61 v 49 cho nhau.
Cy ny thon mn nh ngha heap, v chnh l heap cn to.
Sau khi to c heap, tin hnh sp xp, ta cn ly phn t u v l phn t ln nht
ca cy v thay th n bng phn t cui ca dy. iu ny c th lm vi phm nh ngha heap v
phn t mi a ln gc c th nh hn 1 trong 2 nt con.
Do , thao tc th 2 cn thc hin trn heap l tin hnh chnh li heap khi c 1 nt no
nh hn 1 trong 2 nt con ca n. Khi , ta s tin hnh thay th nt ny cho nt con ln hn.
98
49
53
17
06 25
32
61
98
49
53
61
06 25
32
17
98
61
53
49
06 25
32
17
103
Nu vn vi phm nh ngha heap th ta li lp li qu trnh cho ti khi n ln hn c 2 nt con
hoc tr thnh nt l.
Ta xem xt v d vi heap va to c phn trc:
Ly nt gc 98 ra khi heap v thay th bi nt cui l 17.
Cy ny khng tho mn nh ngha heap v 17 nh hn c 2 nt con l 61 v 53. Tin hnh
i ch 17 cho nt con ln hn l 61.
Vn tip tc vi phm nh ngha heap do 17 nh hn nt con l 49. Tin hnh i ch 17
cho 49, ta c heap mi hon chnh.
Ta c th tc downheap chnh li heap khi nt k khng tho mn nh ngha heap nh
sau:
98
61
53
49
06 25
32
17
17
61
53
49
06 25
32
61
17
53
49
06 25
32
61
49
53
17
06 25
32
104
void downheap(int k){
int j, x;
x=a[k];
while (k<=(m-2)/2){
j=2*k+1;
if (j<m-1) if (a[j]<a[j+1]) j++;
if (x>=a[j]) break;
a[k]=a[j]; k=j;
}
a[k]=x;
}
Trong th tc ny, nt k s c kim tra. Nu n vi phm nh ngha heap th s c thay
bi 1 trong 2 nt con (nt ln hn) ti v tr 2*k v 2*k+1. Sau khi hon i v tr, nu vn tip tc
vi phm nh ngha heap th vic hon i li c thc hin. Qu trnh tip tc cho n khi
khng cn vi phm hoc ti nt l.
Cui cng, th tc heap sort thc hin vic sp xp trn heap to nh sau:
int remove_node(){
int temp;
temp=a[0];
a[0]=a[m];
m--;
downheap(0);
return temp;
}
void heap_sort(){
int i;
m=0;
for (i=0; i<=n-1; i++) insert_heap(a[i]);
m=n-1;
for (i=n-1; i>=0; i--) a[i]=remove_node();
}
Trong on m trn, hm remove() s tr v gi tr l nt gc ca heap. Nt ny s c
chuyn xung cui heap, v nt cui c i ln gc. Kch thc ca heap gim i 1, tin hnh
gi th tc downheap chnh li heap mi.
Th tc heap sort u tin to 1 heap bng cch ln lt chn cc phn t ca dy vo heap.
Tip theo, cc nt gc ln lt c ly ra, heap mi c to v chnh li. Qu trnh kt thc khi
heap khng cn phn t no.
Mt trong nhng tnh cht ca heap sort khin n rt c quan tm trong thc t l thi
gian thc hin thut ton lun l O(NlogN) trong mi trng hp, bt k d liu u vo c tnh
105
cht nh th no. y cng l u im ca heap sort so vi quick sort, thut ton c thi gian thc
hin nhanh nhng trong trng hp xu nht th thi gian ln ti O(N
2
).
7.5 MERGE SORT (SP XP TRN)
7.5.1 Gii thiu
Tng t nh heap sort, merge sort cng l mt gii thut sp xp c thi gian thc hin l
O(NlogN) trong mi trng hp.
tng ca gii thut ny bt ngun t vic trn 2 danh sch c sp xp thnh 1 danh
sch mi cng c sp. R rng vic trn 2 dy sp thnh 1 dy mi c sp c th tn dng
c im sp ca 2 dy con.
thc hin gii thut sp xp trn i vi 1 dy bt k, u tin, coi mi phn t ca dy
l 1 danh sch con gm 1 phn t c sp. Tip theo, tin hnh trn tng cp 2 dy con 1
phn t k nhau to thnh cc dy con 2 phn t c sp. Cc dy con 2 phn t c sp ny
li c trn vi nhau to thnh dy con 4 phn t c sp. Qu trnh tip tc n khi ch cn 1
dy con duy nht c sp, chnh dy ban u.
7.5.2 Trn 2 dy sp
Thao tc u tin cn thc hin khi sp xp trn l vic tin hnh trn 2 dy sp thnh 1
dy mi cng c sp. lm vic ny, ta s dng 2 bin duyt t u mi dy. Ti mi bc,
tin hnh so snh gi tr ca 2 phn t ti v tr ca 2 bin duyt. Nu phn t no c gi tr nh
hn, ta a phn t xung dy mi v tng bin duyt tng ng ln 1. Qu trnh lp li cho
ti khi tt c cc phn t ca c 2 dy c duyt v xt.
Gi s ta c 2 dy sp nh sau:
17 32 49 98 06 25 53 61
trn 2 dy, ta s dng mt dy th 3 cha cc phn t ca dy tng. Mt bin duyt k
dng lu gi v tr cn chn tip theo trong dy mi.
Bc 1: Phn t ti v tr bin duyt j l 06 nh hn phn t ti v tr bin duyt i l 17 nn
ta a 06 xung dy mi v tng j ln 1. ng thi, bin duyt k cng tng ln 1.
17 32 49 98 06 25 53 61
06
i j
i j
k
106
Bc 2: Phn t ti v tr i l 17 nh hn phn t ti v tr j l 25 nn ta a 17 xung dy
mi v tng i ln 1, bin duyt k cng tng ln 1.
17 32 49 98 06 25 53 61
06 17
Bc 3: Phn t ti v tr j l 25 nh hn phn t ti v tr i l 32 nn ta a 25 xung dy
mi v tng j ln 1, bin duyt k cng tng ln 1.
17 32 49 98 06 25 53 61
06 17 25
Bc 4: Phn t ti v tr i l 32 nh hn phn t ti v tr j l 53 nn ta a 32 xung dy
mi v tng i ln 1, bin duyt k cng tng ln 1.
17 32 49 98 06 25 53 61
06 17 25 32
Bc 5: Phn t ti v tr i l 49 nh hn phn t ti v tr j l 53 nn ta a 49 xung dy
mi v tng i ln 1, bin duyt k cng tng ln 1.
17 32 49 98 06 25 53 61
06 17 25 32 49
i j
k
i j
k
i j
k
i j
k
107
Bc 6: Phn t ti v tr j l 53 nh hn phn t ti v tr i l 98 nn ta a 53 xung dy
mi v tng j ln 1, bin duyt k cng tng ln 1.
17 32 49 98 06 25 53 61
06 17 25 32 49 53
Bc 7: Phn t ti v tr j l 61 nh hn phn t ti v tr i l 98 nn ta a 61 xung dy
mi v tng j ln 1, bin duyt k cng tng ln 1.
17 32 49 98 06 25 53 61
06 17 25 32 49 53 61
Bc 8: Bin duyt j duyt ht dy th 2. Khi , ta tin hnh a ton b phn cn li
ca dy 1 xung dy mi.
17 32 49 98 06 25 53 61
06 17 25 32 49 53 61 98
Nh vy, ta c dy mi l dy sp, bao gm cc phn t ca 2 dy ban u.
Th tc tin hnh trn 2 dy sp nh sau:
void merge(int *c, int cl, int *a, int al, int ar, int *b, int
bl, int br){
int i=al, j=bl, k;
for (k=cl; k< cl+ar-al+br-bl+1; k++){
if (i>ar){
c[k]=b[j++];
i j
k
i j
k
i j
k
108
continue;
}
if (j>br){
c[k]=a[i++];
continue;
}
if (a[i]<b[j]) c[k]=a[i++];
else c[k]=b[j++];
}
}
Th tc ny tin hnh trn 2 dy a v b, vi cc ch s u v cui tng ng l al, ar, bl,
br. Kt qu trn c lu trong mng c, c ch s u l cl.
Tuy nhin, ta thy rng thc hin sp xp trn th 2 dy c trn khng phi l 2 dy
ring bit, m nm trn cng 1 mng. Hay ni cch khc l ta trn 2 phn ca 1 dy ch khng
phi 2 dy ring bit a v b nh trong th tc trn. Ngoi ra, kt qu trn li c lu ngay ti dy
ban u ch khng lu ra mt dy c khc.
Do vy, ta phi ci tin th tc trn thc hin trn 2 phn ca 1 dy v kt qu trn c
lu li ngay trn dy .
void merge(int *a, int al, int am, int ar){
int i=al, j=am+1, k;
for (k=al; k<=ar; k++){
if (i>am){
c[k]=a[j++];
continue;
}
if (j>ar){
c[k]=a[i++];
continue;
}
if (a[i]<a[j]) c[k]=a[i++];
else c[k]=a[j++];
}
for (k=al; k<=ar; k++) a[k]=c[k];
}
Th tc ny tin hnh trn 2 phn ca dy a. Phn u c ch s t al n am, phn sau c
ch s t am+1 n ar. Ta dng 1 mng tm c lu kt qu trn, sau sao chp li kt qu vo
mng ban u a.
7.5.3 Sp xp trn
109
tin hnh sp xp trn, u tin ta coi cc phn t ca dy nh cc dy con 1 phn t.
Tin hnh trn tng cp 2 dy con ny c cc dy con c sp gm 2 phn t. Tip tc tin
hnh trn tng cp dy con 2 phn t sp to thnh cc dy con c sp gm 4 phn t v.v.
Qu trnh lp li cho ti khi ton b dy c sp.
Ta xt qu trnh sp xp trn vi dy phn trc.
32 17 49 98 06 25 53 61
u tin, coi mi phn t ca dy nh 1 dy con sp gm 1 phn t. Tin hnh trn tng
cp dy con 1 phn t vi nhau:
32 17 49 98 06 25 53 61
Sau bc ny ta c cc dy con sp gm 2 phn t. Tin hnh trn cc cp dy con
sp gm 2 phn t to thnh dy con c sp gm 4 phn t.
17 32 49 98 06 25 53 61
Sau bc ny ta c cc dy con sp gm 4 phn t. Tin hnh trn 2 dy con sp
gm 4 phn t.
17 32 49 98 06 25 53 61
Cui cng, ta c ton b dy c sp:
06 17 25 32 49 53 61 98
Ci t cho thut ton merge_sort bng qui nh sau :
void merge_sort(int *a, int left, int right){
int middle;
if (right<=left) return;
middle=(right+left)/2;
merge_sort(a, left, middle);
merge_sort(a, middle+1, right);
merge(a, left, middle ,right);
}
110
Trong th tc ny, u tin ta tin hnh chia dy cn sp lm 2 na, sau thc hin li gi
qui merge_sort cho mi na dy. Hai li gi qui ny m bo rng mi na dy ny s c
sp. Cui cng, th tc merge c gi trn 2 na dy sp ny.
7.6 BI TON TM KIM
Tm kim l mt thao tc rt quan trng i vi nhiu ng dng tin hc. Tm kim c th
nh ngha l vic thu thp mt s thng tin no t mt khi thng tin ln c lu tr
trc . Thng tin khi lu tr thng c chia thnh cc bn ghi, mi bn ghi c mt gi tr
kho phc v cho mc ch tm kim. Mc tiu ca vic tm kim l tm tt c cc bn ghi c
gi tr kho trng vi mt gi tr cho trc. Khi tm c bn ghi ny, cc thng tin i km trong
bn ghi s c thu thp v x l.
Mt v d v ng dng thc tin ca tm kim l t in my tnh. Trong t in c rt
nhiu mc t, kho ca mi mc t chnh l cch vit ca t. Thng tin i km l nh ngha ca
t, cch pht m, cc thng tin khc nh loi t, t ng ngha, khc ngha v.v. Ngoi ra cn rt
nhiu v d khc v ng dng ca tm kim, chng hn mt ngn hng lu tr cc bn ghi thng
tin v khch hng v mun tm trong danh sch ny mt bn ghi ca mt khch hng no
kim tra s d v thc hin cc giao dch, hoc mt chng trnh tm kim duyt qua cc tp vn
bn trn my tnh tm cc vn bn c cha cc t kho no .
Trong phn tio theo, chng ta s xem xt 2 phng php tm kim ph bin nht, l tm
kim tun t v tm kim nh phn.
7.7 TM KIM TUN T
Tm kim tun t l mt phng php tm kim rt n gin, ln lt duyt qua ton b cc
bn ghi mt cch tun t. Ti mi bc, kho ca bn ghi s c so snh vi gi tr cn tm. Qu
trnh tm kim kt thc khi tm thy bn ghi c kho tho mn hoc duyt ht danh sch.
Th tc tm kim tun t trn mt mng cc s nguyn nh sau:
int sequential_search(int *a, int x, int n){
int i;
for (i=0; i<n ; i ++){
if (a[i] == X)
return(i);
}
return(-1);
}
Th tc ny tin hnh duyt t u mng. Nu ti v tr no , gi tr phn t bng vi gi
tr cn tm th hm tr v ch s tng ng ca phn t trong mng. Nu khng tm thy gi tr
trong ton b mng th hm tr v gi tr -1.
Thut ton tm kim tun t c thi gian thc hin l O(n). Trong trng hp xu nht,
thut ton mt n ln thc hin so snh v mt khong n/2 ln so snh trong trng hp trung bnh.
7.8 TM KIM NH PHN
Trong trng hp s bn ghi cn tm rt ln, vic tm kim tun t c th l 1 gii php
khng hiu qu v mt thi gian. Mt gii php tm kim khc hiu qu hn c th c s dng
111
da trn m hnh chia tr nh sau: Chia tp cn tm lm 2 na, xc nh na cha bn ghi cn
tm v tp trung tm kim trn na .
lm c iu ny, tp cc phn t cn phi c sp, v s dng ch s ca mng
xc nh na cn tm. u tin, so snh gi tr cn tm vi gi tr ca phn t gia. Nu n nh
hn, tin hnh tm na u dy, ngc li, tin hnh tm na sau ca dy. Qa trnh c lp
li tng t cho na dy va c xc nh ny.
Hm tm kim nh phn c ci t nh sau (gi s dy a c sp):
int binary_search(int *a, int x){
int k, left =0, right=n-1;
do{
k=(left+right)/2;
if (x<a[k]) right=k-1;
else l=k+1;
}while ((x!=a[k]) && (left<=right))
if (x=a[k]) return k;
else return -1;
}
Trong th tc ny, x l gi tr cn tm trong dy a. Hai bin left v right dng gii hn
phn on ca mng m qu trnh tm kim s c thc hin trong mi bc. u tin 2 bin
ny c gn gi tr 0 v n-1, tc l ton b mng s c tm kim.
Ti mi bc, bin k s c gn cho ch s gia ca on ang c tin hnh tm kim.
Nu gi tr x nh hn gi tr phn t ti k, bin right s c gn bng k-1, cho bit qu trnh tm
ti bc sau s c thc hin trong na u ca on. Ngc li, gi tr left c gn bng k+1,
cho bit qu trnh tm ti bc sau s c thc hin trong na sau ca on.
06 17 25 32 49 53 61 98
Xt 1 v d vi dy sp trn, tm kim gi tr 61 trong dy, ta tin hnh cc bc
nh sau:
Bc 1: Phn chia dy lm 2 na, vi ch s phn cch l 3.
0 1 2 3 4 5 6 7
06 17 25 32 49 53 61 98
Gi tr phn t ti ch s ny l 32, nh hn gi tr cn tm l 61. Do vy, tin hnh tm kim
phn t ti na sau ca dy.
Bc 2: Tip tc phn chia on cn tm lm 2 na, vi ch s phn cch l 5.
112
4 5 6 7
49 53 61 98
Gi tr phn t ti ch s ny l 53, nh hn gi tr cn tm l 61. Do vy, tin hnh tm kim
phn t ti na sau ca on.
Bc 3: Tip tc phn chia on, vi ch s phn cch l 6.
6 7
61 98
Gi tr phn t ti ch s ny l 61, bng gi tr cn tm. Do vy, qu trnh tm kim kt thc,
ch s cn tm l 6.
Thut ton tm kim nh phn c thi gian thc hin l lgN. Tuy nhin, thut ton i hi
dy c sp trc khi tin hnh tm kim. Do vy, nn p dng tm kim nh phn khi vic
tm kim phi thc hin nhiu ln trn 1 tp phn t cho trc. Khi , ta ch cn tin hnh sp tp
phn t 1 ln v thc hin tm kim nhiu ln trn tp phn t sp ny.
7.9 CY NH PHN TM KIM
Tm kim bng cy nh phn l mt phng php tm kim rt hiu qu v c xem nh l
mt trong nhng thut ton c s ca khoa hc my tnh. y cng l mt phng php n gin
v c la chn p dng trong rt nhiu tnh hung thc t.
tng c bn ca phng php ny l xy dng mt cy nh phn tm kim. l mt
cy nh phn c tnh cht sau: Vi mi nt ca cy, kho ca cc nt ca cy con bn tri bao gi
cng nh hn v kho ca cc nt ca cy con bn phi bao gi cng ln hn hoc bng kho ca
nt .
Nh vy, trong mt cy nh phn tm kim th tt c cc cy con ca n u tho mn tnh
cht nh vy.
Hnh 7.2 V d v cy nh phn tm kim
7.9.1 Tm kim trn cy nh phn tm kim
49
25
61
17
32 53
98
06
113
Vic tin hnh tm kim trn cy nh phn tm kim cng tng t nh phng php tm
kim nh phn ni trn. tm mt nt c kho l x, u tin tin hnh so snh n vi kho
ca nt gc. Nu nh hn, tin hnh tm kim cy con bn tri, nu bng nhau th dng qu
trnh tm kim, v nu ln hn th tin hnh tm kim cy con bn phi. Qu trnh tm kim trn
cy con li c lp li tng t.
Ti mi bc, ta loi b c mt phn ca cy m chc chn l khng cha nt c kho
cn tm. Phm vi tm kim lun c thu hp li v qu trnh tm kim kt thc khi gp c nt
c kho cn tm hoc khng c nt no nh vy (c ngha l cy con tm l cy rng).
struct node {
int item;
struct node *left;
struct node *right;
}
typedef struct node *treenode;
treenode tree_search(int x, treenode root){
int found=0;
treenode temp=root;
while (temp!=NULL){
if (x < temp.item) temp=temp.left;
elseif (x > temp.item)temp=temp.right;
else break;
}
return temp;
}
Xt cy nh phn tm kim nh hnh 7.2. Gi s ta cn tm nt 32 trn cy ny. Qu trnh
tm kim nh sau:
Bc 1: So snh 32 vi nt gc l 49. Do 32 nh hn 49 nn tin hnh tm kim cy con
bn tri.
Bc 2: So snh 32 vi nt gc ca cy tm kim hin ti l 25. Do 32 ln hn 25 nn tin
hnh tm kim cy con bn phi.
49
25
61
17
32 53
98
06
114
Bc 3: So snh 32 vi nt gc ca cy tm kim hin ti cng l 32. Do 2 gi tr bng nhau
nn qu trnh tm kim kt thc thnh cng.
Nh vy, ch sau 3 php so snh, thao tc tm kim trong 1 danh sch gm 7 phn t kt
thc v cho kt qu.
7.9.2 Chn mt phn t vo cy nh phn tm kim
chn mt phn t vo cy nh phn tm kim, u tin tin hnh qu trnh tm kim nt
cn chn trong cy theo cc bc nh ni trn. Nu tm thy nt trong cy, c ngha l cy
tn ti mt nt c kho bng nt cn chn v vic chn thm nt ny vo cy l khng hp l. Nu
khng tm thy nt trong cy th qa trnh tm kt thc khng thnh cng v ta tin hnh chn nt
vo im kt thc ca qu trnh tm kim.
void tree_insert(int x, treenode *root){
treenode p;
p = (treenode) malloc (sizeof(struct node));
p.item=x;
p.left=p.right=NULL;
if (root==NULL)
root=p;
else if (x < root->item)
tree_insert(x, root->left)
else
tree_insert(x, root->right)
}
}
Th tc trn l mt th tc qui. chn 1 phn t x l cy c gc l root. Tin hnh so
snh x vi kho ca gc. Nu n nh hn kho ca gc th tin hnh chn vo cy con bn tri,
ngc li chn vo cy con bn phi.
25
17
32
06
49
25
61
17
32 53
98
06
115
Xt cy nh phn hnh 7.2 tin hnh chn nt c kho l 30 vo cy, ta tin hnh cc
bc nh sau:
Bc 1: So snh 30 vi kho nt gc l 49. Do 30 nh hn 49 nn tin hnh chn 30 vo
cy con bn tri.
Bc 2: So snh 30 vi kho nt gc ca cy hin ti l 25. Do 30 ln hn 25 nn tin hnh
chn 30 vo cy con bn phi.
Bc 3: So snh 30 vi kho nt gc ca cy hin ti l 32. Do 30 nh hn 32 nn tin hnh
chn 30 vo cy con bn tri.
Bc 4: Do cy hin ti l rng, do vy chnh l v tr nt mi cn chn.
49
25
61
17
32 53
98
06
49
25
61
17
32 53
98
06
49
25
61
17
32 53
98
06
116
T th tc chn mt nt vo cy nh phn tm kim trn, ta c th tc to cy nh phn tm
kim t mt mng cho trc nh sau (cho trc 1 mng a gm n phn t):
void tree_creation(treenode *root){
int i;
for (i=0; i<n; i++) tree_insert(a[i], root);
}
7.9.3 Xo mt nt khi cy nh phn tm kim
xo mt nt khi cy nh phn, ta xt cc trng hp sau:
- Xo 1 nt l: Tho tc xo 1 nt khng c nt con no l trng hp n gin nht. Ch
cn tin hnh loi b nt ra khi cy.
- Xo nt c 1 nt con: Tin hnh loi b nt khi cy v thay n bng nt con.
- Xo nt c 2 nt con: Tin hnh loi b nt v thay th n bng nt con ngoi cng bn
tri ca cy con bn phi hoc nt con ngoi cng bn phi ca cy con bn tri.
7.10 TM TT CHNG 5
- Sp xp l qu trnh b tr li cc phn t ca 1 tp hp theo th t no i vi 1 tiu
ch no .
- Cc gii thut sp xp n gin d dng trong vic ci t nhng thi gian thc hin ln.
- Cc gii thut sp xp phc tp ci t kh khn hn nhng c thi gian chy nhanh
hn.
- Cc gii thut sp xp n gin c thi gian thc hin l O(N
2
) trong khi cc gii thut
sp xp phc tp c thi gian thc hin l O(NlogN).
49
25
61
17
32 53
98
06 30
117
- Quick sort l gii thut sp xp da trn phng php chia tr: Chia dy cn sp
thnh 2 phn, sau thc hin vic sp xp cho mi phn c lp vi nhau. Cc phn t
trong 1 phn lun nh hn 1 gi tr kho, cn cc phn t trong phn cn li lun ln
hn gi tr kho.
- Heap sort l 1 gii thut sp xp da trn heap. l mt cy nh phn hon chnh c
tnh cht kho ca nt cha bao gi cng ln hn kho ca cc nt con. Qu trnh sp xp
s i ch nt gc ca heap cho nt cui, chnh li heap v li lp li qa trnh cho ti
khi dy c sp hon ton.
- Sp xp trn l phng php sp xp da trn vic trn 2 danh sch sp thnh 1 danh
sch cng c sp. Qu trnh sp xp s trn tng cp 2 dy con 1 phn t k nhau
to thnh cc dy con 2 phn t c sp. Cc dy con 2 phn t c sp ny li c
trn vi nhau to thnh dy con 4 phn t c sp. Qu trnh tip tc n khi ton b
dy c sp.
- Tm kim l vic thu thp mt s thng tin no t mt khi thng tin ln c lu
tr trc .
- Tm kim tun t ln lt duyt qua ton b cc bn ghi mt cch tun t. Ti mi
bc, kho ca bn ghi s c so snh vi gi tr cn tm. Qu trnh tm kim kt thc
khi tm thy bn ghi c kho tho mn hoc duyt ht danh sch.
- Tm kim nh phn s dng phng php chia tr: Chia tp cn tm lm 2 na, xc
nh na cha bn ghi cn tm v tp trung tm kim trn na .
- Cy nh phn tm kim l cy nh phn c tnh cht sau: Vi mi nt ca cy, kho ca
cc nt ca cy con bn tri bao gi cng nh hn v kho ca cc nt ca cy con bn
phi bao gi cng ln hn hoc bng kho ca nt .
- Qu trnh tm kim trn cy nh phn tm kim nh sau: tm mt nt c kho l x,
u tin tin hnh so snh n vi kho ca nt gc. Nu nh hn, tin hnh tm kim
cy con bn tri, nu bng nhau th dng qu trnh tm kim, v nu ln hn th tin
hnh tm kim cy con bn phi. Qu trnh tm kim trn cy con li c lp li
tng t.
7.11 CU HI V BI TP
1. Cho dy s:
15 37 12 58 07 24 67
- Nu cc bc trong qu trnh thc hin sp xp chn, sp xp chn, v sp xp ni
bt cho dy trn.
- Vi cch chn kho l phn t u tin, nu cc bc trong qu trnh phn chia dy
lm 2 na vi tnh cht nh trong gii thut Quick sort.
- Nu cc bc to heap t dy s trn.
- Nu cc bc trong qu trnh sp xp trn cho dy s trn.
- Nu cc bc trong qu trnh to cy nh phn tm kim t dy trn. Tin hnh cc
bc tm phn t 07 trong cy.
2. Hon thin m ngun v tin hnh chy cho ra kt qu tt c cc thut ton sp xp c
trnh by trong ti liu.
118
Ph lc 1
HNG DN GII BI TP
CHNG I
1. Sinh vin t gii.
2. Bi ton c th c thit k tng t nh bi ton nt giao thng, s dng thut ton
tham n. Khi , xem mi cp cha u nh l 1 nt ca th v nu 2 cp c th u
trong cng 1 tun th tn ti 1 cnh ni 2 nt tng ng, ngc li khng tn ti
cnh.Tin hnh t mu cho th ny v s mu c t chnh l s tun cn tnh.
3. Sinh vin t gii.
4. Sinh vin t gii.
5. Sinh vin t gii.
6. Sinh vin t gii.
CHNG II
1. Sinh vin t tm kim cc v d v qui trong thc t
2. Sinh vin t gii.
3. Sinh vin t gii.
4. vit chng trnh tnh tng cc s l t 1 n 2n+1, s dng cng thc qui:
tong (2*n+1) = 2*n+1 + tong(2*n-1)
5. Sinh vin t gii.
6. Lm tng t nh bi M i tun.
CHNG III
1. Sinh vin t gii.
2. Sinh vin t gii.
3. Sinh vin t gii.
4. in ra tt c cc phn t ca danh sch, tin hnh duyt t u n cui danh sch. Ti
mi v tr, tin hnh thao tc in gi tr thng tin ca nt.
5. sp xp cc phn t trong mt danh sch c th s dng mt trong cc thut ton
c trnh by chng 7. Tuy nhin, i ch cho 2 phn t trong danh sch, ta
khng cn i ch c nt, m ch cn i gi tr bin item ca mi nt.
6. vit chng trnh cng 2 a thc c biu din thng qua danh sch lin kt, ta cn
s dng mt danh sch lin kt th 3 cha a thc tng. S dng 2 bin duyt duyt
t u mi danh sch, nu trng bc th tin hnh cng 2 h s v a kt qu xung
danh sch tng. Nu khng trng bc th tin hnh a h s ca phn t c bc b hn
xung danh sch tng, chuyn con tr tng ng n phn t tip theo v lp li qu
trnh.
119
7. Tham kho m ngun ti ph lc 2.
CHNG IV
1. Sinh vin t gii.
2. Sinh vin t gii.
3. Sinh vin t gii.
4. Sinh vin t gii.
5. Sinh vin t gii.
6. Thun ton i s nguyn t h thp phn sang h nh phn s dng ngn xp nh sau:
1) Chia s thp phn cho 2.
2) Ly s d a vo ngn xp.
3) Nu thng = 0 th dng
4) Nu thng ln hn 0 th gn s bng thng v quay li bc 1
5) Ln lt ly cc s lu trong ngn xp hin th ra mn hnh, chnh l dng nh
phn ca s ban u.
7. Sinh vin t gii.
8. Tham kho m ngun ti ph lc 2.
9. Tham kho m ngun ti ph lc 2.
CHNG V
1. Sinh vin t gii.
2. Sinh vin t gii.
3. Sinh vin t gii.
4. Sinh vin t gii.
5. Sinh vin t gii.
CHNG VI
1. Sinh vin t gii.
2. Sinh vin t gii.
3. Sinh vin t gii.
4. Sinh vin t gii.
5. Sinh vin t gii.
CHNG VII
1. Sinh vin t gii.
2. Tham kho m ngun ti ph lc 2.
120
Ph lc 2
M NGUN THAM KHO
DANH SCH LIN KT N
#include<stdio.h>
#include<conio.h>
struct node{
int item;
struct node *next;
};
typedef struct node *listnode;
void Insert_Begin(listnode *p, int x);
void Insert_End(listnode *p, int x);
void PrintList(listnode p);
void Insert_Begin(listnode *p, int x){
listnode q;
q = (listnode)malloc(sizeof(struct node));
q-> item = x;
q-> next = *p;
*p = q;
printf("\nThem nut vao dau danh sach thanh cong, bam phim bat
ky de tiep tuc!");
getch();
}
void Insert_End(listnode *p, int x){
listnode q, r;
q = (listnode)malloc(sizeof(struct node));
q-> item = x;
q->next=NULL;
if (*p==NULL) *p=q;
else{
r = *p;
while (r->next != NULL) r = r->next;
r->next = q;
121
}
printf("\nThem nut vao cuoi danh sach thanh cong, bam phim bat
ky de tiep tuc!");
getch();
}
void Insert_Middle(listnode *p, int position, int x){
int count=1, found=0;
listnode q, r;
r = *p;
while ((r != NULL)&&(found==0)){
if (count == position){
q = (listnode)malloc(sizeof(struct node));
q-> item = x;
q-> next = r-> next;
r-> next = q;
found = 1;
}
count ++;
r = r-> next;
}
if (found==0)
printf("Khong tim thay vi tri can chen !");
else
printf("\nThem nut vao vi tri %d thanh cong, bam phim bat
ky de tiep tuc!", position);
getch();
}
void Remove_Begin(listnode *p){
listnode q;
if (*p == NULL) return;
q = *p;
*p = (*p)-> next;
q-> next = NULL;
free(q);
printf("\nXoa nut dau danh sach thanh cong, bam phim bat ky de
tiep tuc!");
getch();
}
void Remove_End(listnode *p){
listnode q, r;
122
if (*p == NULL) return;
if ((*p)-> next == NULL){
Remove_Begin(*p);
return;
}
r = *p;
while (r-> next != NULL){
q = r;
r = r-> next;
}
q-> next = NULL;
free(r);
printf("\nXoa nut cuoi danh sach thanh cong, bam phim bat ky de
tiep tuc!");
getch();
}
void Remove_Middle(listnode *p, int position){
int count=1, found=0;
listnode q, r;
r = *p;
while ((r != NULL)&&(found==0)){
if (count == position){
q = r-> next;
r-> next = q-> next;
q-> next = NULL;
free (q);
found = 1;
}
count ++;
r = r-> next;
}
if (found==0)
printf("Khong tim thay vi tri can xoa !");
else
printf("\nXoa nut o vi tri %d thanh cong, bam phim bat ky
de tiep tuc!", position);
getch();
}
void PrintList(listnode p){
listnode q;
q=p;
123
while (q!=NULL){
printf("%d ",q->item);
q=q->next;
}
printf("\nBam phim bat ky de tiep tuc");
getch();
}
void main(void){
listnode *p;
int x, chon, vitri;
*p=NULL;
do{
clrscr();
printf("CHUWONG TRINH MINH HOA SU DUNG DANH SACH LIEN KET
DON\n\n");
printf("Moi ban chon chuc nang:\n");
printf(" 1. Khoi tao danh sach\n");
printf(" 2. Them phan tu vao dau danh sach\n");
printf(" 3. Them phan tu vao cuoi danh sach\n");
printf(" 4. Them phan tu va giua danh sach\n");
printf(" 5. Xoa phan tu o dau danh sach\n");
printf(" 6. Xoa phan tu o cuoi danh sach\n");
printf(" 7. xoa phan tu o giua danh sach\n");
printf(" 8. In danh sach\n");
printf(" 9. Thoat khoi chuong trinh\n");
printf("Lua chon: ");
scanf("%d",&chon);
switch (chon) {
case 1:
*p=NULL;
break;
case 2:
clrscr();
printf("Cho x= ");
scanf("%d",&x);
Insert_Begin(p, x);
break;
case 3:
clrscr();
printf("Cho x= ");
124
scanf("%d",&x);
Insert_End(p, x);
break;
case 4:
clrscr();
printf("Cho vi tri can chen: ");
scanf("%d",&vitri);
printf("\nCho x= ");
scanf("%d",&x);
Insert_Middle(p, vitri, x);
break;
case 5:
clrscr();
Remove_Begin(p);
break;
case 6:
clrscr();
Remove_End(p);
break;
case 7:
clrscr();
printf("Cho vi tri can xoa: ");
scanf("%d",&vitri);
Remove_Middle(p,vitri);
break;
case 8:
PrintList(*p);
break;
default:
break;
}
}while (chon!=9);
return;
}
CI T NGN XP BNG MNG
#include<stdio.h>
#include<conio.h>
#define MAX 100
125
typedef struct {
int top;
int nut[MAX];
}stack;
void StackInitialize(stack *s);
int StackEmpty(stack s);
int StackFull(stack s);
void Push(stack *s, int x);
int Pop(stack *s);
void StackInitialize(stack *s){
s->top=-1;
return;
}
int StackEmpty(stack s){
return (s.top ==-1);
}
int StackFull(stack s){
return (s.top==MAX-1);
}
void Push(stack *s, int x){
if (StackFull(*s)){
printf("Ngan xep day");
return;
}else{
s-> top ++;
s-> nut[s-> top] = x;
return;
}
}
int Pop(stack *s){
if (StackEmpty(*s)){
printf("Ngan xep rong !");
}else{
return s-> nut[s-> top--];
}
}
CI T NGN XP BNG DANH SCH LIN KT
126
#include<stdio.h>
#include<conio.h>
struct node {
int item;
struct node *next;
};
typedef struct node *stacknode;
typedef struct {
stacknode top;
}stack;
void StackInitialize(stack *s){
s-> top = NULL;
return;
}
int StackEmpty(stack s){
return (s.top == NULL);
}
void Push(stack *s, int x){
stacknode p;
p = (stacknode) malloc (sizeof(struct node));
p-> item = x;
p-> next = s->top;
s->top = p;
return;
}
int Pop(stack *s){
stacknode p;
if (StackEmpty(*s)){
printf("Ngan xep rong !");
}else{
p = s-> top;
s-> top = s-> top-> next;
return p->item;
}
}
127
CI T HNG I BNG MNG
#include<stdio.h>
#include<conio.h>
#define MAX 10
typedef struct {
int head, tail, count;
int node[MAX];
} queue;
void QueueInitialize(queue *);
int QueueEmpty(queue);
void Put(queue *, int);
int Get(queue *);
void QueueInitialize(queue *q){
q-> head = 0;
q-> tail = MAX-1;
q-> count = 0;
return;
}
int QueueEmpty(queue q){
return (q.count <= 0);
}
void Put(queue *q, int x){
if (q->count >= MAX) printf("Hang doi day !\n");
else {
if (q->tail==MAX-1 ) q->tail=0;
else q->tail++;
q->node[q->tail]=x;
q->count++;
}
return;
}
int Get(queue *q){
int x;
if (QueueEmpty(*q)){
128
printf("Hang doi rong !");
}else{
x = q-> node[q-> head];
if (q->head==MAX-1 ) q->head=0;
else (q->head)++;
q-> count--;
}
return x;
}
CI T HNG I BNG DANH SCH LIN KT
#include<stdio.h>
#include<conio.h>
struct node {
int item;
struct node *next;
};
typedef struct node *queuenode;
typedef struct {
queuenode head;
queuenode tail;
}queue;
void QueueInitialize(queue *q){
q-> head = q-> tail = NULL;
return;
}
int QueueEmpty(queue q){
return (q.head == NULL);
}
void Put(queue *q, int x){
queuenode p;
p = (queuenode) malloc (sizeof(struct node));
p-> item = x;
p-> next = NULL;
q-> tail-> next = p;
129
q-> tail = q-> tail-> next;
if (q-> head == NULL) q-> head = q-> tail;
return;
}
int Get(queue *q){
queuenode p;
if (QueueEmpty(*q)){
printf("Ngan xep rong !");
return 0;
}else{
p = q-> head;
q-> head = q-> head-> next;
return p->item;
}
}
CHNG TRNH SP XP CHN
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<alloc.h>
#include<dos.h>
int *a, n, m;
void selection_sort();
void Init();
void In();
void Init(){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
a[i]=random(100);
printf("%5d",a[i]);
}
delay(1000);
}
void selection_sort(){
130
int i, j, k, temp;
for (i = 0; i< n; i++){
k = i;
for (j = i+1; j < n; j++){
if (a[j] < a[k]) k = j;
}
temp = a[i]; a[i] =a [k]; a[k] = temp;
}
}
void In(){
register int i;
for(i=0;i<n;i++)
printf("%5d",a[i]);
printf("\n");
getch();
}
void main(void){
clrscr();
printf("\n Nhap n="); scanf("%d",&n);
a=(int *) malloc(n*sizeof(int));
Init();
selection_sort();
printf("\n\n Day da sap: ");
In();
free(a);
}
CHNG TRNH SP XP CHN
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<alloc.h>
#include<dos.h>
int *a, n, m;
void Init();
void In();
void Init(){
131
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
a[i]=random(100);
printf("%5d",a[i]);
}
delay(1000);
}
void insertion_sort(){
int i, j, k, temp;
for (i = 1; i< n; i++){
temp = a[i];
j=i-1;
while ((a[j] > temp)&&(j>=0)) {
a[j+1]=a[j];
j--;
}
a[j+1]=temp;
}
}
void In(){
register int i;
for(i=0;i<n;i++)
printf("%5d",a[i]);
printf("\n");
getch();
}
void main(void){
clrscr();
printf("\n Nhap n="); scanf("%d",&n);
a=(int *) malloc(n*sizeof(int));
Init();
insertion_sort();
printf("\n\n Day da sap: ");
In();
free(a);
}
CHNG TRNH SP XP NI BT
132
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<alloc.h>
#include<dos.h>
int *a, n, m;
void Init();
void In();
void Init(){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
a[i]=random(100);
printf("%5d",a[i]);
}
delay(1000);
}
void bubble_sort(){
int i, j, temp, no_exchange;
i = 1;
do{
no_exchange = 1;
for (j=n-1; j >= i; j--){
if (a[j-1] > a[j]){
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
no_exchange = 0;
}
}
i++;
} while (!no_exchange && (i < n-1));
}
void In(){
register int i;
for(i=0;i<n;i++)
printf("%5d",a[i]);
133
printf("\n");
getch();
}
void main(void){
clrscr();
printf("\n Nhap n="); scanf("%d",&n);
a=(int *) malloc(n*sizeof(int));
Init();
bubble_sort();
printf("\n\n Day da sap: ");
In();
free(a);
}
CHNG TRNH SP XP NHANH (QUICK SORT)
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<alloc.h>
#include<dos.h>
int *a, n, m;
void Init();
void In();
void Init(){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
a[i]=random(100);
printf("%5d",a[i]);
}
delay(1000);
}
void quick(int left, int right) {
int i,j;
int x,y;
i=left; j=right;
134
x= a[left];
do {
while(a[i]<x && i<right) i++;
while(a[j]>x && j>left) j--;
if(i<=j){
y=a[i];a[i]=a[j];a[j]=y;
i++;j--;
}
}while (i<=j);
if (left<j) quick(left,j);
if (i<right) quick(i,right);
}
void quick_sort(){
quick(0, n-1);
}
void In(){
register int i;
for(i=0;i<n;i++)
printf("%5d",a[i]);
printf("\n");
getch();
}
void main(void){
clrscr();
printf("\n Nhap n="); scanf("%d",&n);
a=(int *) malloc(n*sizeof(int));
Init();
quick_sort();
printf("\n\n Day da sap: ");
In();
free(a);
}
CHNG TRNH SP XP VUN NG (HEAP SORT)
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<alloc.h>
135
#include<dos.h>
int *a, n, m;
void Init();
void In();
void Init(){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
a[i]=random(100);
printf("%5d",a[i]);
}
delay(1000);
}
void upheap(int m){
int x;
x=a[m];
while ((a[(m-1)/2]<=x) && (m>0)){
a[m]=a[(m-1)/2];
m=(m-1)/2;
}
a[m]=x;
}
void insert_heap(int x){
a[m]=x;
upheap(m);
m++;
}
void downheap(int k){
int j, x;
x=a[k];
while (k<=(m-2)/2){
j=2*k+1;
if (j<m-1) if (a[j]<a[j+1]) j++;
if (x>=a[j]) break;
a[k]=a[j]; k=j;
}
a[k]=x;
136
}
int remove_node(){
int temp;
temp=a[0];
a[0]=a[m];
m--;
downheap(0);
return temp;
}
void heap_sort(){
int i;
m=0;
for (i=0; i<=n-1; i++) insert_heap(a[i]);
m=n-1;
for (i=n-1; i>=0; i--) a[i]=remove_node();
}
void In(){
register int i;
for(i=0;i<n;i++)
printf("%5d",a[i]);
printf("\n");
getch();
}
void main(void){
clrscr();
printf("\n Nhap n="); scanf("%d",&n);
a=(int *) malloc(n*sizeof(int));
Init();
heap_sort();
printf("\n\n Day da sap: ");
In();
free(a);
}
CHNG TRNH SP XP TRN (MERGE SORT)
#include<stdio.h>
137
#include<conio.h>
#include<stdlib.h>
#include<alloc.h>
#include<dos.h>
int *a, *c, n, m;
void Init();
void In();
void Init(){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
a[i]=random(100);
printf("%5d",a[i]);
}
delay(1000);
}
void merge2(int *c, int cl, int *a, int al, int ar, int *b, int bl,
int br){
int i=al, j=bl, k;
for (k=cl; k< cl+ar-al+br-bl+1; k++){
if (i>ar){
c[k]=b[j++];
continue;
}
if (j>br){
c[k]=a[i++];
continue;
}
if (a[i]<b[j]) c[k]=a[i++];
else c[k]=b[j++];
}
}
void merge(int *a, int al, int am, int ar){
int i=al, j=am+1, k;
for (k=al; k<=ar; k++){
if (i>am){
c[k]=a[j++];
continue;
138
}
if (j>ar){
c[k]=a[i++];
continue;
}
if (a[i]<a[j]) c[k]=a[i++];
else c[k]=a[j++];
}
for (k=al; k<=ar; k++) a[k]=c[k];
}
void merge_sort(int *a, int left, int right){
int middle;
if (right<=left) return;
middle=(right+left)/2;
merge_sort(a, left, middle);
merge_sort(a, middle+1, right);
merge(a, left, middle ,right);
}
void In(){
register int i;
for(i=0;i<n;i++)
printf("%5d",a[i]);
printf("\n");
getch();
}
void main(void){
clrscr();
printf("\n Nhap n="); scanf("%d",&n);
a=(int *) malloc(n*sizeof(int));
c=(int *) malloc(n*sizeof(int));
Init();
merge_sort(a, 0, n-1);
printf("\n\n Day da sap: ");
In();
free(a);
}
139
TI LIU THAM KHO
[1] Aho, Hopcroft & Ullman, Data Structures and Algorithms,Addison Wesley, 2001.
[2] Robert Sedewick, Algorithms in Java Third Edition,Addison Wesley, 2002.
[3] Niklaus Wirth, Data Structures and Algorithms,Prentice Hall, 2004.
[4] Robert Sedewick, Algorithms,Addison Wesley, 1983.
[5] Bruno R. Preiss, Data Structures and Algorithms with Object-Oriented Design, Jon Wiley &
Sons, 1998.
140
MC LC
CHNG I: PHN TCH V THIT K GII THUT ................................................................. 1
1.1 GII THUT V NGN NG DIN T GII THUT......................................................... 3
1.1.1 Gii thut ...................................................................................................................................... 3
1.1.2 Ngn ng din t gii thut v k thut tinh chnh tng bc................................................... 8
1.2 PHN TCH THUT TON....................................................................................................... 10
1.2.1 c lng thi gian thc hin chng trnh.............................................................................. 11
1.2.2 Tnh ton thi gian thc hin chng trnh................................................................................ 12
1.3 TM TT CHNG 1................................................................................................................ 13
1.4 CU HI V BI TP............................................................................................................... 14
CHNG 2: QUI ........................................................................................................................ 14
2.1 KHI NIM.................................................................................................................................. 15
2.1.1 iu kin c th vit mt chng trnh qui ...................................................................... 16
2.1.2 Khi no khng nn s dng qui............................................................................................. 16
2.2 THIT K GII THUT QUI............................................................................................... 18
2.2.1 Chng trnh tnh hm n! ........................................................................................................... 18
2.2.2 Thut ton Euclid tnh c s chung ln nht ca 2 s nguyn dng...................................... 18
2.2.3 Cc gii thut qui dng chia tr (divide and conquer)....................................................... 19
2.2.4 Thut ton quay lui (backtracking algorithms) .......................................................................... 23
2.3 TM TT CHNG 2................................................................................................................ 31
2.4 CU HI V BI TP............................................................................................................... 32
CHNG 3: MNG V DANH SCH LIN KT ........................................................................ 34
3.1 CU TRC D LIU KIU MNG (ARRAY) ........................................................................ 33
3.2 DANH SCH LIN KT............................................................................................................. 34
3.2.1 Khi nim................................................................................................................................... 34
3.2.2 Cc thao tc c bn trn danh sch lin kt................................................................................ 35
3.2.3 Mt s dng khc ca danh sch lin kt ................................................................................... 44
3.3 TM TT CHNG 3................................................................................................................ 46
3.4 CU HI V BI TP............................................................................................................... 46
CHNG 4: NGN XP V HNG I ....................................................................................... 49
4.1 NGN XP (STACK) .................................................................................................................. 47
4.1.1 Khi nim................................................................................................................................... 47
4.1.2 Ci t ngn xp bng mng ...................................................................................................... 48
141
4.1.3 Ci t ngn xp bng danh sch lin kt................................................................................... 50
4.1.4 Mt s ng dng ca ngn xp................................................................................................... 53
4.2 HNG I (QUEUE) .................................................................................................................. 60
4.2.1 Khi nim................................................................................................................................... 60
4.2.2 Ci t hng i bng mng....................................................................................................... 61
4.2.3 Ci t hng i bng danh sch lin kt ................................................................................... 63
4.3 TM TT CHNG 4................................................................................................................ 65
4.4 CU HI V BI TP ............................................................................................................... 65
CHNG 5: CU TRC D LIU KIU CY ............................................................................. 70
5.1 KHI NIM.................................................................................................................................. 67
5.2 CI T CY ............................................................................................................................. 68
5.2.1 Ci t cy bng mng cc nt cha ............................................................................................ 68
5.2.2 Ci t cy thng qua danh sch cc nt con ............................................................................. 69
5.3 DUYT CY................................................................................................................................ 70
5.3.1 Duyt cy th t trc................................................................................................................ 70
5.3.2 Duyt cy th t gia ................................................................................................................. 71
5.3.3 Duyt cy th t sau................................................................................................................... 71
5.4 CY NH PHN........................................................................................................................... 72
5.4.1 Ci t cy nh phn bng mng................................................................................................. 73
5.4.2 Ci t cy nh phn bng danh sch lin kt............................................................................. 73
5.4.3 Duyt cy nh phn..................................................................................................................... 74
5.5 TM TT CHNG 5................................................................................................................ 75
5.6 CU HI V BI TP ............................................................................................................... 75
CHNG 6: TH ......................................................................................................................... 80
6.1 CC KHI NIM C BN......................................................................................................... 77
6.1.1 th c hng.......................................................................................................................... 77
6.1.2 th v hng.......................................................................................................................... 78
6.1.3 th c trng s....................................................................................................................... 78
6.2 BIU DIN TH..................................................................................................................... 79
6.2.1 Biu din th bng ma trn k................................................................................................ 79
6.2.2 Biu din th bng danh sch k............................................................................................ 80
6.3 DUYT TH ........................................................................................................................... 81
6.3.1 Duyt theo chiu su .................................................................................................................. 81
6.3.2 Duyt theo chiu rng ................................................................................................................ 82
6.3.3 ng dng duyt th kim tra tnh lin thng..................................................................... 84
6.4 TM TT CHNG 6................................................................................................................ 85
142
6.5 CU HI V BI TP............................................................................................................... 85
CHNG 7: SP XP V TM KIM............................................................................................ 90
7.1 BI TON SP XP................................................................................................................... 87
7.2 CC GII THUT SP XP N GIN................................................................................. 88
7.2.1 Sp xp chn .............................................................................................................................. 88
7.2.2 Sp xp chn............................................................................................................................... 89
7.2.3 Sp xp ni bt ........................................................................................................................... 91
7.3 QUICK SORT............................................................................................................................... 94
7.3.1 Gii thiu.................................................................................................................................... 94
7.3.2 Cc bc thc hin gii thut..................................................................................................... 95
7.3.3 Ci t gii thut......................................................................................................................... 96
7.4 HEAP SORT................................................................................................................................. 97
7.4.1 Gii thiu.................................................................................................................................... 97
7.4.2 Cc thut ton trn heap............................................................................................................. 97
7.5 MERGE SORT (SP XP TRN) ............................................................................................ 105
7.5.1 Gii thiu.................................................................................................................................. 105
7.5.2 Trn 2 dy sp ..................................................................................................................... 105
7.5.3 Sp xp trn.............................................................................................................................. 108
7.6 BI TON TM KIM.............................................................................................................. 110
7.7 TM KIM TUN T................................................................................................................ 110
7.8 TM KIM NH PHN .............................................................................................................. 110
7.9 CY NH PHN TM KIM..................................................................................................... 112
7.9.1 Tm kim trn cy nh phn tm kim...................................................................................... 112
7.9.2 Chn mt phn t vo cy nh phn tm kim.......................................................................... 114
7.9.3 Xo mt nt khi cy nh phn tm kim................................................................................. 116
7.10 TM TT CHNG 5............................................................................................................ 116
7.11 CU HI V BI TP........................................................................................................... 117
PH LC I: HNG DN GII CU HI V BI TP.......................................................... 118
PH LC II: M NGUN THAM KHO................................................................................... 120
TI LIU THAM KHO................................................................................................................. 139
HC VIN CNG NGH BU CHNH VIN THNG
CU TRC D LIU
V GII THUT
Bin son : THS. DNG TRN C
CU TRC D LIU
V GII THUT
M s: 412CDG240
Chu trch nhim bn tho
TRUNG TM O TO BU CHNH VIN THNG 1