Вы находитесь на странице: 1из 229
Muc CHUONG 1: TONG QUAN VE CAU TRUC DU LIEU & GT... 1.1. Tam quan trong ciia CTDL & GT trong mét dé An tin h9e...oonnn LLL. Xay dueng cdiu trie dé liéu 1.12. Xay dueng gidi thudt 1.1.3. Mét quan he giita céiu tric dit ligu va gidi thudt 1.2. Dénh gid Cau trie dif ligu & Gidi thuat 1.2.1. Cac tiéu chudin danh gid cdiu trite dit ligu 1.2.2. Dank gid dé phite tap ctta thudt todn 1.3. Kiéu di lieu. 1.3.1. Khai nig vé kid di lieu 1.3.2. Cac kidwu dit ligu co 58 1.3.3. Cac kiéu dit liéu cé cdu tric. 1.3.4. Kiéu dit ligu con tré, 1.3.5. Kiéu dit ligu tap tin. Cau hai va bai tap CHUONG 2: KY THUAT TIM KIEM (Searching) 2.1. Khai quat vé tim Ki€M.....scrornreenensnenene 2.2, Céc gidi thudt tim kiém nd... 2.2.1, Dat vdn dé... 2.2.2. Tim tuygn tinh. 2.2.3. Tim nhi phan 2.3. Céc gidi thudt tim kiém ngoai... 2.3.1. Dat vd di sess 2.3.2. Tim tuyén tinh, 2.3.3. Tim kiém theo chi muc Cau hii va bai tap... CHUONG 3: KY THUAT SAP XEP (SORTING) .. 3.1. Khai quit vé sip xép 19 19 4.2.1 Sdp xép bang phuong phap adi ché.. “20 3.2.2. Sdp xép bang phitong Phdp COM cscs 28 4.2.3. Sdp xép bang phuong phdp chen 33 4.24, Sdp xép bang phuong phdp trén.. oa 40 Cae gidi thugt sip xép ngoai. . . eevee 60 4.3.1. Sdp xép bang phucong phdp tron oo 60 3.3.2, Sdp x€p theo ChE MUC senso 79 Cau hai va hai tap... 82 Guia tink: Cite Pte Dic Ligu va Gidt Thue CHUONG 4: DANH SACH (LIST) 4.1. Khai niém vé danh séch...... 4.2. Cac phép toain trén danh séch... 4.3. Dam sich d¢ oes 4.3.1. Dinh nghia. 4.3.2. Biéu dién danh sdch date 4.3.3. Cac thao téc trén danh sdch dic 85 4.3.4. Uunhugc diém va Ung dung ot 4.4. Danh séch lién két..... sntnninninnnnnnnnsnnnnse DD 44.1. Dink nghia 2 44.2. Danh sach lien két don 2 44.3. Danh sdch lien két kép ul 44.4, Uunhuge diém cia danh sdch lign ké 135 4.8. Danh sich Ran Ch€ 0.0mm 13S 4.5.1, Hang agi 135 4.5.2, Neanxép 142 4.5.3. Ung dung cita danh sdch han ché. “7 (Cu héi va bai tap 147 HUONG 5: CAY (TREE). 5.1. Khai ni¢m - Biéu dién cay... 149 149 5.1.1. Dink nghia cdy . sow 149 5.1.2, Mét s6’khdi nigm lién quan... sow 149 S13, BibU diEN CY ornsnnrrern soo 151 5.2, Cy nj phan... 152 5.2.1. Dink nghia... 152 5.2.2, Biéudign va Cae thao téc 152 5.2.3, Cay nhi phan tim kiém.. soo 163 5.3. Cay cAn bing... . oo 188 5.3.1. Dinh nghta ~ Clu trite di lieu - 188 5.3.2. Cae thao tée . 189 CA hai va DAL AP eee 27 ON TAP (REVIEW). Hé théng lai cdc Cau triic dif ligu va ede Giai thudt 44 hoc 224 C4u hi va Bai tap 6n tap téng hop 227 TAI LIEU THAM KHAO 229 REVIEWED By Hitt thu ¢1d 06h Ichos kh Trang: 2 Guia tink: Cite Puie Dic Litu va Gidt Thue Chuong 1: TONG QUAN VE CAU TRUC DU LIEU VA GIAI THUAT 1.1. Tém quan trong cua cau tric di ligu va gidi thuat trong mot dé dn tin hoc 1.1.1. Xay dung cau tric dit liéu C6 thé néi rang khéng cé mét chudng trinh may tinh ndo ma khéng cé dif ligu dé xt ly. Di ligu cé thé la dif ligu dua vao (input data), diy ligu trung gian hoae dif ligu dua ra {output data). Do vay, viée té chifc dé luu trit da ligu phye vy cho chusng trinh cé ¥ nghia rét quan trong trong toan b6 hé théng chung trinh. Viée xy dung cau tric dit ligu quyét dinh rét lén dén chat lugng cang nhw céng ste cla ngusi lap trinh trong viée thiét ké, cai dat chung trinh. 1.1.2. xXay dung giai thuat Khai nigm giai thuat hay thuét gidi ma nhiéu khi con duge goi la thuat todn ding dé chi phudng phép hay cdch thifc (method) dé giai quyét van dé. Giai thuat cé thé duge minh. hoa bang ng6n ngit ty nhién (natural language), bang s¢ dé (flow chart) hoac bang ma gid (pseudo code). Trong thyc té, gidi thuat thudng duge minh hoa hay thé hién bing ma gid tya trén mot hay mot sé ngon ngit lap trinh nao dé (thudng la ngon ngit ma nguéi lap trinh chon dé cai dat thuat toan), chang han nhu C, Pascal, Khi da xée dinh dugc cdu tric dif ligu thich hgp, ngudi lap tinh sé bét dau tiga hanh xay dying thuat gidi tudng ting theo yéu céu cia bai todn dat ra trén cd s8 cua cu tric dif ligu da duse chon. Bé giai quyét mét van dé cé thé cé nhiéu phung phap, do vay suf Iya chon phugng phap ph hgp 18 mét viée ma nguéi lap trinh phai can nhac va tinh, toan. Su Iya chon nay cing ¢é thé gop phdn dang ké trong viée giam bét cong viée ca ngudi lap trinh trong phan cai dat thuat toan tren mot ngon naif cy thé. 1.1.3. M6i quan hé gitta cdu tric di liéu va gidi thuat Méi quan hé gitta c&u trac dif ligu va Giai thuat ¢6 thé minh ha bang dang thitc: Cu trie dif ligu + Gidi thuat = Chuding trinh Nhu vay, khi da c6 céu tric dir ligu tét, ndm ving gidi thuat thyc hién thi vige thé hién chugng trinh bing mét ngén ngif cy thé chi la van dé théi gian. Khi cé cu trite dif liu ‘ma chu tim ra thuat gidi thi khéng thé cé chudng trinh va nguge lai khong thé cé Thuat gidi khi chua cé céu trac dif ligu. Mét chudng trinh may tinh chi cé thé duige hoan thign khi cé day di ca Cau tric dif ligu dé luu trot dit ligu va Gidi thuat xt ly dif liu theo yeu céu cla bai toan dat ra. 1.2. Banh gid cau tric dd ligu va gidi thuat 1.2.1, Cae tiéu chudn dénh gid cau tric dit ligu Dé danh gid mot cdu tric dif ligu ching ta thudng dya vao mét sé tiéu chi sau: - Cu trate dif ligu phai tiét kiém tai nguyén (bo nhé trong), REVIEWED nae By Hilt thu ¢18 06h ichos kh eat 9:19 pm, Jun 25, 2007 Guia tink: Cite Puie Dic Litu va Gidt Thue ~ Cu trac dif liéu phai phan anh ding thye té cia bai toan, - Cu tric dif ligu phai d& dang trong viée thao tac dir ligu, 1.2.2. Daénh gid d6 phic tap cua thuat toan Vige danh gia d6 phite tap ciia mot thuat todn qué khong dé dang chut nao. 6 day, ching ta chi muén uéc lugng thdi gian thyc hién thugn toan T(n) dé cé thé c6 sy so sénh tudng déi gitta céc thuat todn véi nhau. Trong thyc té, théi gian thy hién mét thuat ton cén phy thudc rét nhiéu vao céc diéu kién khéc nhu cu tgo ca may tinh, dir ligu dua vao, .., 8 day ching ta chi xem xét trén mite dé cia lugng dif ligu dua vao ban dau cho thuat toan thuc hign. é ude lugng thei gian thyc hign thuat ton ching ta cé thé xem xét théi gian thyc hin thuat todn trong hai truéng hg - Trong trugng hgp t6t nhét: Tmin - Trong truding h¢p xéu nhét: Tmax Ta 46 chiing ta cé thé ue Iugng thai gian thyc hién trung binh ciia thuat toén: Tavg 1.3. Kiéu da ligu 1.3.1. Khai niém vé kiéu da lieu Kigu dat ligu T c6 thé xem nhu la sy két hgp cia 2 thanh phan: - Mién gia tri ma kiéu dir ligu T c6 thé Iuu trit: V, - Tap hgp céc phép todn dé thao téc dif ligu: O. T= Méi kidu dif ligu thuéng duge dai dign béi mét ten (dinh danh). Méi phan tl dif ligu C6 kigu T sé c6 gid tri trong mién V va cé thé dude thyc hin cac phép ton thudc tap hgp cc phép toan trong O. Dé luu trot cae phan ti dif liu nay thuding phai tén mét sé byte(s) trong bd nhé, sé byte(s) nay goi la kich thuéc cia kiéu di ligu. 1.3.2, Cac kiéu dit ligu co sé Hau hét cac ng6n ngit lap trinh déu ¢6 cung cép cac kiéu di ligu co sé. Tay vao méi ng6n ngif ma céc kiéu dif ligu co 6 cé thé 6 céc tén goi khac nhau song chung quy lai co nhiing logi kiéu dif ligu co sé nhu sau: - Kigu s6 nguyén: C6 thé c6 dau hoac khong cé déu va thudng c6 céc kich thuéc sau: + Kiéu sé nguyén 1 byte + Kigu 56 nguyen 2 bytes + Kigu s6 nguyén 4 bytes Kigu s6 nguyén thudng dude thyc hién véi cée phép todn: O = (+, -, *, /, DIV, MOD, <, =} Trang: 4 Guia tink: Cite Puie Dic Litu va Gidt Thue ~ Kiéu sé thye: Thudng cé cae kich thuée sau: + Kigu 6 thyc 4 bytes + Kigu sé thye 6 bytes + Kidu sé thuc 8 bytes + Kigu s6 thye 10 bytes Kigu s6 thye thuéng duge thyc hién véi céc phép toan: O = (4, >)". hy <>) <= ~ Kidu ky ty: '6 thé 6 cac kich thudc sau: + Kigu ky ty byte + Kidu ky ty 2 bytes Kigu ky ty thuéng duge thyc hign vai cae phép toan: O = (4, 5) <> <= CHR, ..} - Kiéu chudi ky ty: Co kich thude tay thugc vae ting ng6n ngif lap trinh =, ORD, Kigu chudi ky ty thudng duge thuc hin véi céc phép todn: O = {+, & < Length, Trunc, ..} Kigu lugn ly: Thudng cé kich thuée 1 byte Kiéu luan ly thudng duge thuc hién véi cdc phép ton: © = (NOT, AND, OR, XOR, <, >, + 1.3.3. Cac kiéu dit liéu cé céu tric Kiéu di ligu cé cu tric la cac kiéu dif lieu duge xay dyng trén co sd cac kiéu dif lieu da cé (c6 thé Iai la mét kiéu dif ligu c6 cdu tric khdc). Tay vao ting ngén ngit lap trinh song thu@ng cé céc loai sau - Kigu mang hay cén goi la day: kich thuéc bang téng kich thudc cla céc phan ti - Kiéu ban ghi hay cu trde: kich thuée bang téng kich thude céc thanh phan (Field) 1.3.4, Kiéu dé 1iéu con tré Cae ngén ngif lap tinh thuéng cung cp cho ching ta mét kiéu dif ligu dae biet dé Iu ‘rit cc dja chi cla bo nhé, dé 1a con tré (Pointer). Tuy vao loai con trd gan (near pointer) hay con tré xa (far pointer) ma kigu dif ligu con tré c6 céc kich thie khac nhau: + Con tré gan: 2 bytes + Con tré xa: 4 bytes 1.3.5, Kiéu do ligu tap tin Tap tin (File) c6 thé xem la mot kiéu dif ligu dac biét, kich thue tsi da cua tap tin tay thugc vao khéng gian dia ndi luu trv tap tin. Viée doc, ghi dif ligu truc tiép trén tap tin rét mat théi gian va khéng bdo dim an toan cho dif liéu trén t€p tin dé. Do vay, trong thyc té, chiing ta khong thao téc tryc tiép di ligu trén tap tin ma ching ta can chuyén tung phan hoac toan bé ndi dung cia tap tin vao trong bé nhé trong dé xit ly Geko trink: Cite Tuie Dit Lite ua Guidi Vhnst Céu hdi va Bai tap 1, Trinh bay tdm quan trong cia Cu trac dif ligu va Giai thuat Adi véi ngudi lp trink? 2. Cac tieu chudn dé danh gié cu tric dit ligu va gidi thuat? 3. Khi xay dung gidi thuat cé can thiét phdi quan tam téi cu tric dif ligu hay khéng? Tei sao? 4, Liet ké cac kigu dif ligu co 88, céc kigu dif ligu cé edu tric trong C, Pascal? 5. Su dung cac kiéu dif ligu co ban trong C, hay xay dung cau trac dif ligu dé hau trot trong bé nhé trong (RAM) cla may tinh da thifc c6 bac ty nhién n (0 a,x’ = Véi cdu trac div ligu duge xay dying, hay trinh bay thuat todn va cai dat chuong trinh dé thyc hign cc céng vige sau: - Nhép, xuét céc da thet. Tinh gié tri cla da thitc tai gid tri xo ndo dé. - Tinh téng, tich cia hai da thife. 6. Tuong ty nhu bai tép 5. nhung da thifc trong trudng sé hitu ty Q (cdc hé s6 a va x la cc phan 86 c6 tl s6 va mau s6 la cdc s6 nguyen). 7. Cho bang gié tau di ti ga Saigon dén céc ga nhu sau (ga cudi la ga Ha néi): taupi | s2 | sa | sé | so | sio | sia | sia | sie | sie | ina | sna HANH TRING [32 9 [at gi [a1 ge [a1 gi [at gd [a1 gs [a1 ga [aT gid [ai gs [27a [ogo ‘SAIgon oI | 21g00 | 21950| 11g10-| 15940 | 10900 | 12430 17400 | 20g00 | 22920 | 13420 | 16940 AUGNG MAN 2gi0 | 15921 [19955 [14907 [16981 | 2igoa [1gis | 3916 [17935 [2950 CTHAP CHAM 5g01 | 19g06 | 22947 [1694 | 9g19 | 0908 | ag05 | 6403 | 20919 | 2915 ‘RHA TRANG | agI0 | 6747 | 20900 dp47 | 10950 | 21910 | 1957 | 5042 | 6906 | 22946 5915 TOY HOA 5943 | 23409 [ 3499 [a1g55 | og19 | 5g11 | 6936 | 10950 | 20 Dibra! | agi? | Hgts | 1420 | 5946 2g30 {7909 | 10942 | 13900 4915. {GUANG NCAT nati {aa55 | 9a24 | snze [5955 [aigar [iaqss | 7q08 [738 TAMKY git | 10459 | 4458 | 7g10| 12940 | 16g08-[ 10921 | 9,05 A NANG | 13527 | 19908 | 6929 | 12920| 6919 | 9926 | 14p41 | 17943 | 20917 | 10955 HAE | teg21 | 22982! 12929] 15987 | Tigi? | 14932 | 18913 | 2igrs | 23950 1510 BONG HA gid [13952 | 17g12 | 12942 [16905 | 19g38 | 22498 [1925 BONG HOT | Seis | age? [15982 [rots [raat [759 [ange [og [378 vine [23921 | 7945 | 21g00| 1908 | 20912 | 29950 2459 | 7907 | 9420 CTHANH HOA Toute | ogo) | 4a33 [23900 | 3493 | 6u39 | 9950 [12.20 NINH BINH ragoe | 1gaa [5954 ogs1 | 4g60 | 7957 [gia | 1345 NAM BINH rags | ago1_ [6576 [ages [5922 | 6999 | nigea | 14995 PHOLY 13g2x | 2942 [7908 | 2a02 | 6,00_[ 9900 _[ 12925 | 15406 DEW HA NOT | 3900 | 14p40| 4900 | 6930 | 3915 | 7910 | 10925 | 13pa5| 16920 Sit dung céc kiéu dif ligu co ban, hay xay dung cu tric dif ligu thich hop dé lau trit bang gid tau trén vao bé nhé trong va bé nhé ngoai (disk) cla may tinh. Vei cau trac dif ligu di duge xay dung & trén, hay trinh bay thuat toan va cai dat chusng trinh dé thyc hign céc céng vige sau: = Xuét ra gid dén cla mét tau Ty nao dé tai mot ga Go nao 46, Trang: 6 Guia tink: Cite Puie Dic Litu va Gidt Thue ~ Xudt ra gid dén cde ga cla mét tau To nao dé, - Xudt ra gid céc tau dén mot ga Go nao dé. - Xuat ra bang gid tau theo mau & trén. Lute ¥: Céc 6 tréng ghi nhgn tai cac ga d6, tau nay khéng di dén hoae chi di qua ma khéng diing lai. = Dong “HANH TRINH” ghi nhan téng sé gid tau chay ti ga Saigon dén ga Ha néi. 8. Tuong ty nhy bai tap 7. nhung chung ta cn ghi nhan thém thong tin vé doan tau khi ding tai cdc ga chi dé trénh tau hay dé cho khach lén/xudng (cdc dong in nghieng tuong ting véi cdc ga c6 khAch len/xudng, c&c dong khéc chi ding dé trénh tau). 9. Sit dung kiéu di ligu cu tric trong C, hay xay dung cu trac di ligu dé lau tri trong, b6 nhé trong (RAM) cia méy tinh trang thai cla cdc cét dén giao thong (c6 3 dén: Xanh, Dé, Vang). Voi cdu tric dir ligu da duge xay dyng, hay trinh bay thuat todn va cai dt chung trinh dé mé phéng (minh hoa) cho hoat déng ciia 2 cét dan trén hai tuyén dudng giao nhau tai mot nga tu. 10, Sit dung céc kigu dif ligu cd ban trong C, hay xy dung edu tric dif ligu dé Iuu trit trong bé nhé trong (RAM) cia méy tinh trang thai cla mét ban cé CARO cé kich thuée MxN (0 < M,N < 20). Véi cu tric dif liu duge xay dung, hay trinh bay thuat toan va cai dat chudng trinh dé thyc hign cdc céng viée sau: - In ra man hinh ban c& CARO trong trang thai hign hanh, Kiém tra xem c6 ai théng hay khéng? Néu cé thi théng béo “Két thic”, néu khéng 6 thi théng bao “Tiép tue”. Trang: 7 Guia tink: Cite Puie Dic Litu va Gidt Thue Chuong 2: KY THUAT TIM KIEM (SEARCHING) 2.1. Khai quat vé tim kiém Trong thyc té, khi thao tac, khai théc dif ligu chung ta hau nhy luc nao cang phai thye hign thao tac tim kiém. Viéc tim kiém nhanh hay cham tay thugc vao trang thai va trat ty cla dif ligu trén dé. Két qué cia viéc tim kiém cé thé la khong cé (khéng tim théy) ho€c cé (tim thy). Néu két qua tim kiém la cé tim thay thi nhiéu khi ching ta cén phai xéc dinh xem vi tri cla phan tif dif ligu tim thay 1a ¢ dau? Trong pham vi cia chyong nay chuing ta tim cach gidi quyét cdc cau hdi nay. Trude khi di vao nghién cuu chi tiét, ching ta gid sit rang méi phan tit dif ligu duge xem xét cé mot thanh phan khéa (Key) dé nhan dién, c6 kiéu dif ligu la T nao dé, cae thanh phan cén lai la théng tin (Info) lién quan dén phan tu dif ligu d6. Nhu vay méi phan tif dir ligu ¢6 cu trac dif ligu nhu sau: typedef struct DataElement (T Key; InfoType Info; } DataType; Trong tai ligu nay, khi néi téi gia tri ca mot phan tix dir ligu ching ta mudin néi téi gia tri khéa (Key) ca phan tit dif ligu d6. Bé ddn gidn, ching ta gid st rang méi phan tit dir ligu chi la thanh phan khéa nhan dién. Vige tim kim mot phan tlt c6 thé dién ra trén mét day/mang (tim kiém néi) hoae din ra trén mét tap tin/ file (tim kiém ngoai). Phan tir can tim la phan ti cdn théa man diéu kign tim kiém (thudng c6 gié tr| bang gia trj tim kiém). Tay thudc vao ting bai toan cy thé ma digu kién tim kiém c6 thé khéc nhau song chung quy viée tim kiém dif ligu thutng duge van dyng theo céc thuat toan trinh bay sau day. 2.2. Cée giai thudt tim kiém ngi (Tim kiém trén day/mang) 2.2.1. Dat van dé Gia sit chiing ta cé mot mang M gém N phan til. Vén dé dat ra la cé hay khéng phan tif 6 gia tr] bang X trong mang M? Néu cé thi phn tw ¢6 gié tri bang X la phan tif thit my trong mang M? 2.2.2, Tim tuyén tinh (Linear Search) ‘Thuat toan tim tuyén tinh cdn duge goi la Thuat todn tim kiém tuan ty (Sequential Search). a. Tu tudng: Lan lugt so sinh céc phan tit cla mang M véi gia tri X bat dau ty phan tiv dau tien cho dén khi tim dén duge phan ti c6 gid tri X hodc da duyét qua hét tat cd cdc phan tl ca mang M thi két thi. Guia tink: Cite Puie Dic Litu va Gidt Thue b. Thudt todn: Bik «1 //Duyet tit déu mang B2: IF M[k] +X AND kN //Néu chu tim thay va cling chua duyét hét mang B21: k++ B2.2: Lap lai B2 B3: IF k M[Mid]: Rat ngén pham vi tim kiém vé nifa sau cila day M (First = Mid+1) Lap lai qua trinh nay cho dén khi tim thay phan tt cé gié tri X hoa pham vi tim kigm ca chiing ta khéng cén nifa (First > Last). b. Thudt todn dé quy (Recursion Algorithm): B1: First = 1 B2: Last = N B3: IF (First > Last) //Hét pbam vi tim kiém 3.1; Khéng tim thdy 3.2: Thy hign Bkt BA: Mid = (First + Last)/ 2 B5: IF (X = M[Mid]) 5.1; Tim thay tai vj tri Mid B5.2: Thye hign Bkt B6: IF (X < M[Mid]) Tim 48 quy tu First dén Last = Mid ~ 1 B7: IF (X > M[Mid]) Tim 4@ quy tu First = Mid + 1 dén Last Bkt: Két thic ¢. Cai dat thudt todn d@ quy: Ham BinarySearch cé prototype: int BinarySearch (T M{J, int N,T X); Ham thye hién vigc tim kiém phan tif c6 gié tri X trong mang M cé N phan tit da 6 thi ty tang. Néu tim thay, ham tra vé mét sé nguyén cé gid tri tir O dén N-1 1a vi tri tuong ting cla phan ti tim thy. Trong truéng hgp ngue lai, ham tra vé gid tri -1 (khong tim thay). Ham BinarySearch su dung ham dé quy RecBinarySearch cé prototype: int RecBinarySearch(T M[], int First, int Last, T X); Ham RecBinarySearch thyc hién viée tim kiém phan tir cé gia tri X trén mang M trong pham vi ti phan ty thf First dén phan ti thi Last. Néu tim thdy, ham tra vé mot s6 nguyén cé gié tri ti First dén Last la vi tri tung ting cia phan ty tim thay. Trong trudng h¢p ngude Iai, ham tré vé gia tri -1 (khong tim théy). Noi dung cita cae ham nhu sau: Guia tink: Cite Puie Dic Litu va Gidt Thue int RecBinarySearch (T Ml], int First, int Last, T X) {if (First > Last) return (-1); int Mid = (First + Last)/2; if (X == M[Mid]) return (Mid); if (X < M[Mid]) return(RecBinarySearch(M, First, Mid ~ 1, X)); else return(RecBinarySearch(M, Mid + 1, Last, X)); I int BinarySearch (T M{J, int N,T X) {return (RecBinarySearch(M, 0, N ~ 1, X)); } d. Phan tich thudt todn d@ quy: - Trung hgp t6t nhét khi phan ty 6 gitta cla mang 6 gia tr] bang X ‘86 phép gan: Gmin = 1 Sé phép so sinh: Smin = 2 - Truéng hgp xu nhét khi kh6ng tim théy phan tix nao ¢6 gid tri bang X: Sé phép gn: Gmax = logs + 1 Sé phép so sénh: Smax = 3logN + 1 - Trung binh: Sé phép gan: Gavg = Yslog:N + 1 ‘86 phép so sénh: Savg = %&(3log:N + 3) ¢. Thugt todn khong dé quy (Non-Recursion Algorithm): Bl: First = 1 B2: Last = N B3: IF (First > Last) 3.1: Khéng tim théy B3.2: Thye hién Bkt Ba: Mid = (First + Last)/2 B5: IF (X = M[Mid]) 5.1: Tim thay tai vi tri Mid B5,2: Thyc hién Bkt B6: IF (X < M[Mid]) B6.1: Last = Mid - 1 B6.2: Lap lai B3 BY: IF (X > M[Mid]) B7.1: First = Mid + 1 B7.2: Lap lai B3 Bkt: Két thac Guia tink: Cite Puie Dic Litu va Gidt Thue todn khng d@ quy: ait thud Ham NRecBinarySearch cé prototype: int NRecBinarySearch (T MJ, int N, TX); Ham thy hign vige tim kiém phan ti c6 gié tri X trong mang M cé N phan tit da 6 thi ty tang. Néu tim thay, ham tra vé mét sé nguyén cé gid tri ti 0 dén N-I la vi tri tuong ting cla phan ti tim thay. Trong truéng hgp ngugc lai, ham tra vé gia tri -1 (khong tim thay). Noi dung ca ham NRecBinarySearch nhu sau: int NRecBinarySearch (T MI] int N, T X) (int First int Last = N- while (First <= Last) { int Mid = (First + Last)/2: if (X == M[Mid]) return( Mid) if (X < M[Mid]) Last = Mid ~ 1 else First = Mid + 1; return(-1); } &. Phan tich thudt todn khong d@ quy: ‘TruGng hdp tt nhat khi phan ti 6 gitfa cla mang cé gi tri bang X: $6 phép gan: Gmin = 3 S6 phép so sdnh: Smin = 2 - Truéng hgp xdu nhét khi kh6ng tim théy phan tix ndo ¢6 gid tri bang X: Sé phép gan: Gmax = 2logoN + 4 S6 phép so sénh: Smax = 3log:N + 1 - Trung binh: Sé phép gn: Gavg = logaN + 3.5 Sé phép so smh: Savg = ¥4(3log.N + 3) h, Vidu: Gia sit ta cé day M gdm 10 phan tif cé khéa nhut sau (N = 10): 1 3 4 5 8 15 17 22 25 30 ‘Truéc tién ta thye hign tim kiém phan tif c6 gid tri X = 5 (tim théy): Lan lap | First | Last | First > Last] Mid ] M[Mid] |X X< X> mimic) | moi) | mimic) Ban diu[ o | 9 False 4 8 False | True | False i o [3 False 1 3 False | False | True 2 2 [3 False 2 4 False | False | True 3 3 [3 False 3 5 True Trang: 13 Guia tink: Cite Puie Dic Litu va Gidt Thue Kt qua sau 3 lan lap (4@ quy) thuat toan két thac. - Bay gid ta thc hién tim kiém phan tu c6 gid tri X = 7 (khéng tim théy) Lan lap | First | Last [First > Last] Mid | M[Mid) |X Xe X> mimidy | m(miay | M[Mid) Bandaul 0 | 9 False 4 8 False | True | False 1 o [3 False 1 3 False | False | True 2 2 [3 False 2 4 False | False | True 3 3 [3 False 3 5 False | False | True 4 4 [3 True Kt qua sau 4 lan lap (48 quy) thuat toan két thi. © Liu y: > Thuat toan tim nhj phan chi c6 thé van dung trong trugng hgp day/mang da cé thif ty. Trong truéng hgp téng quat ching ta chi cé thé 4p dung thuat toan tim kigm tuan ty. > Céc thuat todn dé quy ¢6 thé ngén gon song tén kém bo nhé dé ghi nhan ma enh chung trinh (méi lan goi dé quy) khi chay chusng trinh, do vay cé thé lam cho chung trinh chay cham lai. Trong thyc té, khi viét chung trinh néu ¢6 thé chiing ta nén sif dung thuat toan khéng dé quy. 2.3. Céc gidi thuat tim kiém ngoai (Tim kiém trén tap tin) 2.3.1. Dat van dé Gia sty chiing ta cé mét tp tin F lu tra’ N phan tif, Van dé dat ra la cé hay khong phan tt ¢6 gié tri bang X duge luu trit trong tap tin F? Néu cé thi phan ti cé gia tr] bang X la phan tit nam @ vj tri nao trén tap tin F? 2.3.2, Tim tuyén tinh a. Tu tudinj Lan lugt doc cdc phan tl tir ddu tap tin F va so sénh véi gid tri X cho dén khi doc duge phan tir c6 gié tri X hode 48 doc hét tap tin F thi két the 6. Thugt todn: Bi:k=0 B2: rewind(F) /N@ dau tap tin F B3: read(F, a) //Boc mot phan tit ti tap tin F BA: k = k + sizeof(T) /INi tri phan ti hign hanh (sau phan ti méi doc) B5: IF az X AND |(eof(F)) Lap lai B3 B6: IF (a = X) Tim thay tai vi tri k byte(s) tinh tir dau tap tin B7: ELSE Khong tim thay phan ty c6 gia tri X Trang: 14 Guia tink: Cite Puie Dic Litu va Gidt Thue B8: Két thic . Cai dat thudt todn: Ham FLinearSearch c6 prototype: long FLinearSearch (char * FileName, T X); Ham thye hién tim kiém phan tir c6 gia tri X trong tap tin ¢6 tén FileName, Néu tim thay, ham tra vé mét s6 nguyén cé gi tri ti O dén filelength(FileName) 18 vj tri tudng (ing cla phan tit tim thay so véi dau tap tin (tinh bang byte). Trong truéng hgp gue lai, hoac cé 16i khi thao tac trén tap tin ham tr vé gid trj -1 (khéng tim thay hoac I6i thao téc trén tap tin). Noi dung cla ham nhu sau: long FlinearSearch (char * FileName, T X) ( FILE * Fp; Fp = fopen(FileName, “rb"); if (Fp == NULL) return (-1); long k = 0; Ta int SOT = sizeof(T); while (!feof(Fp)) {if (fread(&a, SOT, 1, Fp) = break; k =k + SOT; if (a == X) break; 0) } fclose(Fp); if (a == X) return (k - SOT); return (-1); } d. Phan tich thudt todn: - Trung hgp tét nhét khi phdn tif dau tien cua tap tin c6 gid tri bing X: ‘86 phép gan: Gmin = 1+ 2=3 S6 phép so sanh: Smin = 2 + 1 $6 lan doc tap tin: Dmin = 1 - Trung hgp xu nhat khi khéng tim thay phan tif nao 6 gia tri bang X: Sé phép gin: Gmax = N+ 2 ‘86 phép so sanh: Smax = 2N + 1 Sé lan doc tép tin: Dmax = N th: 'S6 phép gan: Gavg = ¥2(N + 5) S6 phép so snh: Savg = (3 + 2N 4 1):2=N+2 ‘86 lan doc tap tin: Davg = 2(N + 1) - Trung bi Guia tink: Cite Puie Dic Litu va Gidt Thue 2.3.3. Tim kiém theo chi muc (Index Search) Nhu chiing ta da biét, mdi phan ti dif ligu dugc Iu tri trong tap tin dif ligu F thu’ng co kich thuée lén, digu nay cing lam cho kich thuée cia tap tin F cling kha lén. Vi vay vigc thao téc dif ligu tryc tiép len tap tin F sé tré nén lau, chua ké sy mat an toan cho dif ligu trén tap tin. Dé gidi quyét vén dé nay, di kam theo mot tap tin dif ligu thu@ng cé thém cac tap tin chi muc (Index File) dé lam nhiém vy diéu khién thir ty truy xuat dir ligu trén tp tin theo mét khéa chi muc (Index key) ndo d6, Méi phan tif dif ligu trong tap tin chi myc IDX gém cé 2 thanh phan: Khéa chi myc va Vi tri vat ly cua phan tir dir ligu c6 khéa chi myc tudng ting trén tap tin dif ligu. Cu trac dif ligu cila cae phan ti trong tap tin chi muc ohu sau: typedef struct IdxElement (T IdxKey; long Pos; }ldxTypes Tap tin chi muc luon ludn duge sép xép theo thif ty tang ctia kha chi myc. Vige tao tap tin chi myc IDX sé duge nghién cifu trong Chusng 3, trong phén nay chung ta xem nhu da ¢6 tap tin chi myc IDX dé thao tac. a. Tuttiing: Lan lugt doc céc phan tif tr dau tap tin IDX va so sanh thanh phan khéa chi muc véi gia tri X cho dén khi doc duge phan tif c6 gia tri khéa chi myc lén hen hoa bing X hoge da doc hét tap tin IDX thi két thic. Néu tim théy thi ta da cé vi tri vat ly cla phan tl dif ligu trén tap tin dif ligu F, khi d6 ching ta c6 thé truy cap truc tiép dén vi tri nay dé doc dir ligu cua phan t tim thay. b. Thudt todn: B1: rewind(IDX) B2: read(IDX, ai) B3: IF ai.ldxKey < X AND !(eof(IDX)) Lap lai B2 B4: IF ai.ldxKey = X Tim thay tai vi tri ai.Pos byte(s) tinh tir ddu tp tin BS: ELSE Khong tim thay phan tiv c6 gia tri X B6: Két thie dat thugt ton: Ham IndexSearch c6 prototype: long IndexSearch (char * IdxFileName, T X); Ham thuc hign tim kiém phan ti c6 gid tri X dy trén tap tin chi muc c6 tén IdxFileName. Néu tim thdy, ham tré vé mot sé nguyén cé gia tri ty 0 dén filelength(FileName)-1 la vj tri tuéng ng cia phan ti tim thay so véi dau tap tin dit ligu (tinh bang byte). Trong tru@ng hgp nguge lai, hode cé léi khi thao téc trén tap tin chi myc ham tra vé gié tri -1 (khéng tim thay). Noi dung ca ham nbu sau Trang: 16 Guia tink: Cite Puie Dic Litu va Gidt Thue long IndexSearch (char * IdxFileName, T X) { FILE * IDXFp; IDXFp = fopen(IdxFileName, “rb”); if (IDXFp == NULL) return (-1); ldxType ai; int SOIE = sizeof(ldxType); while (lfeof(IDXFp)) {if (fread(&ai, SOIE, 1, IDXFp) break; if (ai.ldxKey break; x) 3 felose(IDXFp); if (aildxKey == X) return (2i.Pos); return (-1); i d. Phan tich thugt ton: - Trung hgp tét nhat khi phén tir dau tien cia tap tin chi myc c6 gia tr] khéa chi muc Ién hon hoge bing X: ‘86 phép gan: Gmin = 1 Sé phép so sinh: Smin = 2+ 1 $6 lan doc tap tin: Dmin - Truéng hgp xéu nhat khi moi phan ti trong t€p tin chi myc déu cé khéa chi myc hé hon gid tri X: ‘86 phép gan: Gmax = 1 Sé phép so sinh: Smax = 2N + 1 86 lan doc tap tin: Dmax = N - Trung binh: 86 phép gan: Gavg = 1 Sé phép so sinh: Savg = (3 + 2N+ 1):2=N+2 Sé lan doc t€p tin: Davg = ¥2(N + 1) Cau hdi va Bai tap 1. Trinh bay tu tuéng ca céc thuat toan tim kiém: Tuyén tinh, Nhj phan, Chi myc? Cac thuat toan nay cé thé duge van dyng trong cac trugng hgp nao? Cho vi du? 2. Cai dat lai thuat toan tim tuyén tinh bang céc cach: - Si dung vong lap for, - Si dung ving lap do ... while? C6 nhan xét gi cho mdi trudng hgp? Trang: 17 Guia tink: Cite Puie Dic Litu va Gidt Thue . Trong truding hdp cdc phan tir cla day da cé thif ty tang, hay cai tién lai thuat toan tim tuyén tinh? Cai dat cdc thuat todn cai tién? Danh gid va so sanh gitfa thuat ton nguyén thy véi cdc thuat toan cai tién. 4. Trong truding hgp céc phan tif ca day da cé thif ty’ gidm, hay trinh bay va cai dat lai thuat toan tim nbj phan trong hai truéng hgp: Bé quy va Khéng dé quy? 5. Van dung thuat toan tim nhj phan, hay cai tién va cai dat lai thuat toan tim kiém dya theo tap tin chi myc? Banh gid va so sanh gia thuat toan nguyén thy véi cdc thuat toan cai tién? 6. Si dung ham random trong C dé tao ra mot day (mang) M c6 tdi thiéu 1.000 sé nguyén, sau dé chon ngau nhién (cing bang ham random) mét gia tri nguyén K. Van dung céc thuat todn tim tuyén tinh, tim nhi phan dé tim kiém phan tif cé gié tri K trong mang M. cdc thuat ton, Véi cing mét dif ligu nhu nhau, cho bit thai gian thy hié 7. Trinh bay va cai dat thudt toan tim tuyén tinh déi véi céc phan tit trén mang hai chigu trong hai tru&ng hgp: - Khong sit dyng phan tir “C&m canh”. C6 si dung phan tu “Cm canh’. Cho biét thai gian thye hign cia hai thuat ton trong hai trudng hop trén. 8. Sit dung ham random trong € dé tao ra téi thigu 1.000 s6 nguyén va liu tri vao mot tap tin cé ten SONGUYEN.DAT, sau dé chon ngau nhién (cing bang ham random) mét gid tri nguyén K. Van dung thuét toan tim tuyén tinh dé tim kiém phan tif c6 gid tri K trong tap tin SONGUYEN.DAT. 9. Thong tin vé méi nhan vign bao gém: Ma sé ~ 8 mét sé nguyén dung, Ho va Dem la mot chéi cé téi da 20 ky ty, Ten nhan vién - la mot chudi cé tdi da 10 ky ty, Nagay, Thang, Nam sinh ~ la céc s6 nguyén ducng, Phai - La “Nam” hoae “Na”, Hé 6 ludng, Ludng can ban, Phu cép - la céc sé thyc. Viét chudng trinh nhap vao danh sdch nhan vién (it nhat 1a 10 ngu@i, khéng nhap trang ma gitfa céc nhan vién véi nhau) va Iuu trit danh séch nhan vién nay vao mét t§p tin cé tén NHANSU.DAT, sau 46 van dyng thuat ton tim tuyén tinh dé tim kiém trén tap tin NHANSU.DAT xem cé hay khéng nhan vién cé ma 1a K (gid tri cla K 6 thé nhap vao ti ban phim hoac phat sinh bang ham random). Néu tim thy nhan vién cé mé la K thi in ra man hinh toan bé thng tin vé nhan vien nay. 10. Véi tap tin dir ligu co ten NHANSU.DAT trong bai tap 9, thy hign cac yéu céu sau: Tao mét bang chi muc theo Tén nhan vien. - Tim kiém trén bang chi muc xem trong tap tin NHANSU.DAT c6 hay khéng nhan vign 6 tén la X, néu cé thi in ra toan bé théng tin vé nhan vién nay. - Luu trif bang chi myc nay vao trong tép tin cé tén NSTEN.IDX. - Van dung thuat ton tim kiém dy trén tap tin chi myc NSTEN.IDX dé tim xem cé hay khéng nhan vién cé tén la X trong tap tin NHANSU.DAT, néu cé thi in ra toan 6 thong tin vé nhan vien nay, C6 nhan xét gi khi thye hign tim kiém dif ligu trén tap tin bang céc phudng phép: Tim tuyén tinh va Tim kiém dye trén tap tin chi muc. Trang: 18 Guia tink: Cite Puie Dic Litu va Gidt Thue Chuong 3: KY THUAT SAP XEP (SORTING) 3.1. Khai quat vé sap xép Bé thuan tién va gidm thiéu théi gian thao tac ma dac biét la dé tim kiém dir ligu dé dang va nhanh chéng, théng thuéng trudc khi thao tac thi dif ligu trén mang, trén tap tin da cé this ty. Do vay, thao tac sép xép dif ligu la mét trong nhimng thao tac can thiét va thung gap trong qua trinh Iau tri, quan Iy di lieu This ty xuét hién diy ligu c6 thé la thit ty tang (khong giém dan) hode thi ty giém (khong tang dan). Trong pham vi chuong nay ching ta sé thc hién viée sép xép dir ligu theo thu’ ty tang. Viée sp xép dif ligu theo thi ty gidm hoan toan tudng ty. Cé rét nhigu thuat toan s4p xép song ching ta ¢6 thé phan chia céc thuat toan sép xép thanh hai nhém chinh cén cif vao vi tri lutu trif cla dif ligu trong may tinh, d6 1a: - Cac gidi thuat sdp xép thi ty n@i (sp xép thif ty trén day/mang), - Cac gidi thuat sp xép thi ty ngoai (sép xép thit ty trén tap tinsfile). ing nhu trong chudng truéc, chting ta gid sif rang méi phan tif dif ligu duge xem xét cé mot thanh phan khéa (Key) dé nhan dién, cé kiéu dir ligu la T nao dé, céc thanh phan cén lai la théng tin (Info) lién quan dén phan tif dif liu d6. Nhu vay méi phan tit di ligu ¢6 edu trae dif lieu nh sau: typedef struct DataElement (T Key; InfoType Info; } DataType; Trong chong nay néi riéng va tai liu nay néi chung, cdc thuat toan sp xép cla ching ta la sép x€p sao cho céc phan ti dif ligu c6 thif ty tang theo thanh phan khoa (Key) nhan dién, Dé don gidn, ching ta gid sif rang mdi phan tir dif ligu chi la thanh. phan khéa nhan dién, 3.2. Cac giai thuat sdp xép ndi (Sap xép trén day/mang) 6 day, toan bé dif ligu can sap xép dugc dua vao trong bé nhé trong (RAM). Do vay, so phan ur dir ligu khéng lén lm do gidi han cia bé nhé trong, tuy nhién téc d6 sdp xép tudng 46i nhanh. Cac giai thuat sp xép ngi bao gém cac nhém sau: - Sp xép bang phusng phép dém (counting sort), - Sp xép bang phucng phép déi ché (exchange sort), xép bang phuiéng php chon Iya (selection sort), - Sdp xép bang phuong phép chan (insertion sort), - Sap xép bang phusng phap tron (merge sort) Trong pham vi cla gido trinh nay ching ta chi trinh bay mét sé thuat toan sp xép tiéu bigu trong céc thuat toan sép xép 8 cdc nhém tren va gia sif thit ty sp xép N phan tur 6 kigu dif ligu T trong mang Mla thif ty tang, Trang: 12 Guia tink: Cite Puie Dic Litu va Gidt Thue 3.2.1. Sdp xép bang phuong php déi ché (Exchange Sort) Cac thugt toan trong phan nay s@ tim cach déi ché cdc phan tit diing sai vj tri (so vai mang da sp xép) trong mang M cho nhau dé cuéi cling tét cd céc phan tu trong mang M déu vé ding vj tri nh mang da sdp xép. Cac thuat ton sdp xép bing phucng phap déi ché bao gém: - Thuat toan sép xép néi bot (bubble sort), - Thuat toan sép xép léc (shaker sort), - Thuat toan s4p xép gidm d6 tang hay dé dai buéc gidm dan (shell sort), - Thuat toan sép xép dya trén sy phan hoach (quick sort). 6 day chang ta trinh bay hai thuat toan phé bién la thuat toan sép xép néi bot va sdp xép dya trén sy phan hoach. a. Thudt todn sdp x€p ndi bot (Bubble Sort): - Tu tudng: + Bi tir cudi mang vé dau mang, trong qué trinh di néu phan ti 6 duéi (ding phia sau) nhé hon phan tl ding ngay trén (truéc) né thi theo nguyén téc cua bot khi phan ti nhe sé bj “tréi” lén phia trén phan tu nang (hai phan ti nay sé duge dé ché cho nhau). Két qua la phan tif nhd nhat (nhe nhét) sé dugc dua lén (trdi len) trén bé mat (ddu mang) rét nhanb. + Sau méi lan di ching ta dua due mét phan ti tréi lén ding ché. Do vay, sau N-1 lin di thi tt c cdc phan ti trong mang M sé c6 thif ty tang. + Thuat toan: Thy hin Bkt B3: ELSE B3.1: Under = N B3.2: If (Under = First) Thyc hign B4 B3.3: Else 3.3.1: if (M[Under] < M[Under - 1]) Swap(M[Under], M[Under - 1]) ___//B8i ché 2 phan tit cho nhau 3.3.2: Under-~ 3.3.3: Lap lai B3.2 B4: Firste+ BS: Lap lai B2 Bkt: Két thic = Cai dgt thugt toan: Ham BubbleSort ¢é prototype nhy sau: void BubbleSort(T Mf], int N); Trang: 20 Geko trink: Cite Truie Dit Lite ua Guidi Vhnst Ham thuc hign vige sdp xép N phan wi cé kidu dit liu T wen mang M theo thi ty tang dya trén thuat toan sp xép néi bot. Noi dung ca ham nhu sau: void BubbleSort(T MI], int NN) { for (int |= 0; 1 < N-1; ++) for (int J = Nel; J > I; J--) if (M[J] < M{J-1)) ‘Swap(M[J], M[J-1]); return; } Ham Swap c6 prototype nhu sau: void Swap(T &X,T &Y); Ham thyc hign vige hoan vj gié tri cua hai phan tir X va Y cho nhau. Noi dung cla ham nhu sau: void Swap(T &X,T &Y) (T Temp = X; X=Y; Y = Temp; return; ) - Vi dy minh hoa thugt toan: Gia sit ta can sp xép mang M cé 10 phan ter sau (N = 10): M15 10 2 20 10 5 25 35 22 30 Ta sé thyc hién 9 lan di (N- 1 = 10 - 1 = 9) dé sp x€p mang M: Lan 1: First = 1 J: 2<— 3<— 4<— 5<— 6<— 7<— 8<— 9<— 10 Trang: 21 Guia tink: Cite Puie Dic Litu va Gidt Thue M 2 15 10 5 20 10 2 2 35 30 Lan 2: First = 2 J: Be 4 6 0 C™» m2 1 1 5 2 1 2 2 C™ m2 1 5 2 2 3035 CY m2 1 i Fw 2 2 2 308 M2 Rj 10 100 «202288 M2 5 15 10 10 2 2 2 30 35 Lan 3: First = J: 4<— 5<— 6<— 7<— 8<— 9«— 10 Lan 4: First = 4 J: 5<— 6<— 7<— 8<— 9<— 10 M2 5 10 Ss; 200220: «258085 M2 5 10 10 15 20 22 2 30 35 Lan 5: First = 5 J: 6<— 7<— 8<+— 9<— 10 M2 5 10 10 15 2 2 2 30 35 Lan 6: First = 6 J: 7<— 8<—9<—10 M2 5 10 10 15 20 2 2 30 35 Trang: 22 Guia tink: Cite Puie Dic Litu va Gidt Thue Lan 7: First = 7 J: 8<—9<—10 M2 5 10 10 15 20 22 2 30 35 Lan 8: First = 8 Js 9<—10 M2 5 10 10 15 20 22 25 30 35 Lan 9: First = 9 J: 10 M2 5 10 10 15 20 22 25 30 35 Sau 9 lan di mang M tré thanh: M2 5 10 10 15 2 22 2 30 35 - Phan tich thugt toan: + Trong mai truéng hop: Sé phép gan: G= 0 S6 phép so sinh: S = (N-1) + (N-2) +. + 1 = YeN(N-1) + Trong truéng hep t6t nhét: khi mang ban dau da cé thirty tang 6 phép hodn vi: Hmin = 0 + Trong truéng hgp xau nhét: khi mang ban dau da cé thir ty gia S6 phép hoan vi: Hmin = (N-1) + (N-2) + .. + 1 = %N(N-1) + S6 phép hon vi trung binh: Havg = Y4N(N-1) - Nhan xét vé thuat toan bot: + Thuat todn sp xép néi bot kha den gidn, dé hiéu va dé cai dat. + Trong thuat toan sép xép néi bot, mai lan di ti cuéi mang vé ddu mang thi phan ti nhe duge trdi lén rat nhanh trong khi d6 phan tl nng lai “chim” xuéng kha cham chap do khong tan dung duge chiéu di xudng (chiéu tir déu mang vé cuéi mang). + Thuat toan ni bot khéng phat hién ra dugc céc dogn phan tit ndm hai déu cia mang da nam ding vi tri dé cé thé giam bét quang duéng di trong mai lan di b. Thuat todn sip xép dua trén su phan hoach (Partitioning Sort): Thuat toan sép xép dya trén sy phan hoach cén duge goi la thuat todn sép xép nhanh (Quick Sort). - Tu tuéng: + Phan hoach day M thanh 03 day con cé thi ty tudng déi théa man diéu kién: Day con thit nhat (dau day M) gém céc phan tt c6 gid tr] nhé hen gia tri trung binh cla day M, Trang: 23 Guia tink: Cite Puie Dic Litu va Gidt Thue Day con thif hai (gitta day M) gém cdc phan ul cé gid ti bang gia tr] tung binh cla day M, Day con thit ba (cudi day M) gdm céc phan tif cé gia tri Ién hen gié tri trung binh cla day M, + Néu day con thit nhat va day con thif ba c6 nhigu hdn 01 phan tif thi chung ta lai tiép tuc phan hoach dé quy cac day con nay. + Vige tim gid tri trung binh ciia day M hoac tim kiém phan tif trong M cé gid tri bang gid tri trung binh cia day M rat khé khan va mét théi gian. Trong thy té, ching ta chon mot phan ty bat ky (thudng la phan tt diing 4 vj tri giita) trong day cac phan ti cn phan hoach dé lam gia tri cho céc phan ti ca day con thif hai (day giita) sau khi phan hoach. Phan tty nay cén duge goi la phan tt bién (boundary element). Cac phan tif trong day con thif nat s@ cé gia tr nhd hon gid tri phan tir bién va cac phan ti trong day con thit ba sé c6 gié tri Ién hon gia tri phan tir bien. + Vige phan hoach mét day dude thye hién bing céch tim céc cp phan ti diing & hai day con hai bén phan tty gitfa (day 1 va day 3) nhung bi sai thi tu (phan tir diing 6 day 1 cé gid tri lén hon gid tr phan tir gitfa va phan ti diing & day 3 c6 gia tri nhé hen gié tri phan tit gitta) dé déi ché (hoan vi) cho nhau. - Thudt toan: BI: First = 1 B2: Last = N B3: IF (First > Last) _//Day con chi cén khong qué 01 phan ti Thye hién Bkt B4: X= M[(First+Last)/2] —_//Lay gia tri phan tt gia B5:1= First //Xudt phat tur ddu day 1 dé tim phn tir c6 gié tri > X BE: IF (M(l] > X) Thyc hign BB BT: ELSE B7.1: [e+ B7.2: Lap lai B BB: J =Last —_//Xudt phat tif cudi day 3 dé tim phan ti c6 gia tri < X B9: IF (M[J] < X) Thye hign B11 B10: ELSE B10.1: J-- B10.2: Lap lai B9 BIL IF (I< J) B1L.1: Hoén_Vi(M{l], M[J]) BIL.2: e+ B1L.3: J. B11.4: Lap lai B6 B12: ELSE B12.1: Phan hoach dé quy day con tir phan ti thit First dén phan ti thet J B12.2: Phan hoach d@ quy day con tiz phan ti thit | dén phan ti thif Last Bkt: Két thic = Cai dat thuat toan: Trang: 24 Guia tink: Cite Puie Dic Litu va Gidt Thue Ham QuickSort ¢é prototype nhu sau: void QuickSort(T MI], int N); Ham thyc hign viée sép xép N phan tif c6 kigu diy ligu T trén mang M theo thi ty tang dua trén thuat ton sp xép nhanh. Ham QuickSort sit dung ham phan hoach dé quy PartitionSort dé thyc hign viéc s4p xép theo thif ty tang céc phan tif cla mot day con gidi han tY phan tl thir First dén phan ti thif Last trén mang M. Ham PartitionSort cé prototype nhu sau: void PartitionSort(T Ml], int First, int Last); Noi dung cia céc hm nhu sau: void PartitionSort(T MI], int First, int Last) {if (First >= Last) return; T X= Mi(First+Last)/2]; int [= First; int J = Last; do { while (M[I] < X) Lets while (M[J] > X) J if (<= J) { Swap(Mil], M[J]); Ie ) } while (I <= J); PartitionSort(M, First, J); PartitionSort(M, I, Last); return; } I void QuickSort(T M[], int N) { PartitionSort(M, 0, N-1); return; } + Vi dy minh hoa thuat toan: Gia sit ta can sp xép mang M cé 10 phan tix sau (N = 10): M45 55° 25 20 15 5 «025 30 108 Ban dau: First=1 — Last=10 X= M[(1+10)/2] =M{5] = 15 First XAls Last M45 55 2520 <> 5 2 30 10 3 Phan hoach: Trang: 25 Guia trink: Cite Pie Dic Litu va Guid Thue i X als M45 55 2520 <> 5 2 30 nN M3 552520 5 2530 —— nS a M3 10-2520 5 2530 AON 1 Xai5 M3 10) OS «> 25 2530 First X15 1 M3 10 5 <> » 25 25 (30 Phan hoach céc phan ti trong day con tt First -> J: First=1 Last =J=4 X= M{(1+4)/2] = M(2] = 10 First X 410 Last M3 5 15 20 25 530 Phan hoach: 1 Xo J m 3 Kod 5 1 2 80 x 15200252530 Phan hoach céc phan tu trong day con ti First -> Jt First = 1 Last = J=2 X= M{(1+2)/2] = M1] =3 Figst— Last M: 5 10 15 20 2 25 30 =a 103 J lo 45 5545 5545 Last 5545 5545 5545 5545 5545 5545 Trang: 26 Guia tink: Cite Puie Dic Litu va Gidt Thue J X¥3 i x3 oo M: 5 10 15 20 25 25 Phan hoach céc phan ty trong day con tir -> Last: First=1=3 Last=4 X= M{(3+4)/2] - M[3] - 10 First Last M3 2 (> 5 mo xYio Phan hoach: J M3 5 <> 15200 25 xY10 200-255 & x10 J 1 Mm 38 <> 1 2 5s X=10 Fist J 4 M: 3 5 10, 15 20 25 25 Phan hoach céc phan tt trong day con tif -> Last: First =1=5 Last= 10 X = M[(5+10)/2] = M[7] = 25 30 30 30 30 30 30 30 30 30 30 55 45 Last Last Trang: 27 Guia tink: Cite Puie Dic Litu va Gidt Thue IL X q25 J M 3 5 10 15 20 25 > 30. 5545 1 X 325 Mm 35 wo 4@ xo as First % 3 5 0 2 > = sows Phan hoach céc phan tif trong day con ti First -> J First =5 Last = J = 6 X = M{(5+6)/2] = M[5] = 20 Fyyst Last M3 5 1015 2 25 30554 x¥20 Phan hoach: J Mm 3 5 1 3 > a 2% 30 55s xY¥20 id M3 5 10 15 25 25 3005545 x20 J 1 M 3 5 10 15 <> 25 25 305545 xY¥20 First JI Last M3 5 10 15 20 25 25 30 55 45 Phan hoach céc phan ty trong day con tir -> Last: First 7 Last=10 X= M[(7+10)/2] = M[8] = 30 First. X = 30 Last 3 5 10 15 200 5 5545 Phan hoach: M3 5 10 150 205 5545 \ M3 5 10 15 200 5 <0) 5545 Trang: 28 Guia tink: Cite Puie Dic Litu va Gidt Thue X= 30 J 1 X=30 X 30 Phan hoach céc phan tt trong day con tif -> Last: 9 Last=10 X= M{(9+10)/2] = MIS] = 55 st Last M 3 5 10 15 20 25 25 30 <> 45 First x55 Phan hoach: J M 3 5 10 15 20 25 25 30 45 x J M 3 5 10 15 20 25 25 30 45 x55 M 3 5 10 15 20 25 25 30 45 55 Toan bé qua trinh phan hoach két thic, day M tré thanh: M 3 5 10 15 20 25 25 30 45 55 - Phan tich thugt toén: + Trudng hgp tot nhét, khi mang M ban dau da cé thi ty tang: 86 phép gén: Gmin = 1+2+4+.. + 2"[Loga(N) - 1] =N-1 6 phép so sénh: Smin = NxLog,(N)/2 6 phép hoan vi: Hmin = 0 + Trung hgp xdu nhat, khi phan tit X duge chon & gitfa day con la gia tri ln nhat clia day con. Trutng hgp nay thuat toan QuickSort tré nén cham chap nhét: ‘86 phép gan: Gmax = 1 + 2+.. + (Nel) = Nx(N-1)/2 Sé phép so sénh: Smax = (N-1)x(N-1) 6 phép hodn vi: Hmax = (N-1) + (N-2) +. + 1 Nx(N-1)/2 + Trung binh: $6 phép gan: Gavg = [(N-1)+N(N-1)/2]/2 = (N-1)x(N+2)/4 6 phép so sénh: Savg = [NxLog,(N)/2 + Nx(N-1)]/2 = Nx[Loga(N)+2N-21/4 Sé phép hoan vi Havg = Nx(N-1)/4 Trang: 22 Guia tink: Cite Pie Dic Litu wa Gidt Thue 3.2.2. Sap xép bang phuong phap chon (Selection Sort) Cac thuat toan trong phan nay sé tim cach Iva chon céc phan tif théa man diéu kién chon Iya dé dua vé dung vi tri cla phan tir d6, cuéi cing tét cd cae phan tlt trong mang M déu vé ding vj tri. Cac thuat ton sp xép bang phung phap chon bao gém: - Thuat toén sp xép chon tryc tiép (straight selection sort), - Thuat ton sp xép dya trén khdi/heap hay s4p xép trén cay (heap sort) day ching ta chi trinh bay thuat todn sép xép chon tryc tiép Thuét todn sdp xép chon tru tigp (Straight Selection Sort): = Tu tudng: + Ban dau day cé N phan ti chua c6 thi ty. Ta chon phan ti c6 gié tri nhé nhat trong N phan tit chufa cé thif ty nay dé dua lén dau nhom N phan ti + Sau lan thif nhat chon Iya phan tit nhé nhat va dufa [én déu nhém chiing ta cén lai N-1 phan tit dting & phia sau day M chua cé this ty. Chung ta tip tue chen phan tif c6 gi tri nhd nhét trong N-1 phan ti chua cé thif ty nay dé dua lén ddu nhém N-1 phan tt, ... Do vay, sau N-1 lan chon Iva phén ti nhé nhét dé dua len déu nhém thi tét c& céc phan tif trong day M sé cé thif ty tang + Nhu vay, thuat todn nay chi yéu chung ta di tim gié tri nhé nhét trong nhém N-K phan tt chua c6 thit ty diing 4 phia sau day M. Viée nay dan gian chiing ta van dung thuat todn tim kiém tuan ty, = Thust toan: BI:K=0 Ba: IF (K = N-1) Thue hign Bkt B3: Min = M[K+1] Ba: PosMin = K+1 BB: Pos = K+2 BG: IF (Pos > N) Thue hign B8 BT: ELSE B7.1: If (Min > M[Pos}) B7.1.1: Min = M[Pos] B7.1.2: PosMin = Pos B7.2: Pos++ B7.3: Lap lai BE BB: HoanVi(M[K+1], M[PosMin]) BO: Kis B10: Lap lai B2 Bkt: Két thie + Cai dat thuat toan: Ham SelectionSort c6 prototype nhu sau: Trang: 30 Guia tink: Cite Puie Dic Litu va Gidt Thue void SelectionSort(T MJ, int); Ham thuc hién viée sép xép N phan ttt cé kiéu di ligu T trén mang M theo thir ty tang dy trén thuat todn sap xép chon truc tigp. Noi dung ca ham nhu sau void SelectionSort(T MJ, int N) { int K = 0, PosMin; while (K < N-1) 4 T Min PosMin = K; for (int Pos = K+1; Pos < N; Pos++) if (Min > M[Pos]) { Min = M[Pos]; PosMin = Pos } Swap(M[K], M[PosMin]); Kees 4 return; } + Vi dy minh hoa thuat toan: AS Gia sit ta can sp xép mang M cé 10 phan tty sau (N = 10): M1 60 2 25 15 45 5 30 33 20 Ta sé thyc hign 9 lan chon Iva (N- 1 mang M: Lan 1: Min Kel M 1 60 2 22 15 45 5 30 33 20 10 - 1 = 9) phan tir nhé nhét dé sp xép PosMin=1 K=0 Lan 2:Min=2 PosMin=3 K=1 Kel =) M f 60 2 2 15 45 5 30 33 20 SS Kel Mo 2 6 2 15 4 5 30 33 20 Lan 3:Min=5 PosMin=7 K=2 K. MoT 2 0515 5S 8 8B 20 Kel MoT 2 5 2 15 45 60 30 33 20 Trang: 31 Guia tink: Cite Puie Dic Litu va Gidt Thue Lan 4: Min = 15 PosMin=5 K=3 Ky 1 2 5 2 15 45 60 30 33 20 Kel M of 2 5 15 25 45 60 30 33 20 Lan 5: Min = 20 PosMin = 10 K =4 a M of 2 5 15 2 45 60 30 33 20 Kel M of 2 5 15 20 4 60 30 33 25 Lan 6: Min = 25 PosMin = 10 K =5 Kel a M of 2 5 15 20 4 60 30 33 25 KR Kel M of 2 5 15 20 25 606 30 33 45 Lan 7: Min = 30 PosMin= 8 K = 6 Ke M of 2 5 15 200 25 “4 ? 3345 Kel 1 2 5 15 20 25 30 60 33 45 Lan 8: Min = 33 PosMin=9 K =7 K+ ro 5 M of 2 5 15 20 25 30 60 33 45 tL Kel M of 2 5 15 20 25 30 33 60 45 Lan 9: Min = 45 PosMin = 10 K = 8 er Mm oF 2 5 1 2 25 30 33 J Trang: 32 Guia tink: Cite Puie Dic Litu va Gidt Thue Kal M7 2 5 15 20 25 30 33 45 60 Sau lan 9: K = 9 va mang M tré thanh: MoT 2 5 15 20 25 30 33 45 60 + Phan h thugt toan: + Trong moi trudng hop: Sé phép so sénh: S = (N-1)+(N-2)+at1 = Nx(N-1)/2 S6 phép hoan vi: H = N-1 + Trung hgp t6t nhat, khi mang M ban dau da cé thif ty tang: Sé phép gan: Gmin = 2x(N-1) + Trung hgp xu nhat, khi mang M ban dau da cé thif ty giam dan: S6 phép gan: Gmax = 2x[N+(N-1)+ .. +1] = Nx(N+1) + Trung binh Sé phép gan: Gavg 2x(N-1)4Nx(N+1)]/2 = (Nel) + Nx(N+1)/2 3.2.3. Sdp xép bang phuong phap chén (Insertion Sort) Cac thuat toan trong phan nay sé tim cach tan dung K phan ti déu day M da cé thi ty tang, ching ta dem phan tu thir K+1 chén vao K phan ti dau day sao cho sau khi chen chting ta c6 K+1 phan tu dau day M da cé thi ty tang. Ban dau day M cé ft nhat 1 phan tir ddu day da cé thif ty tang (K=1). Nhu vay sau téi da N-1 bude chen la chung ta sé sp xép xong day M cé N phan tif theo thif ty tang, Cac thugt ton sép xép bing phuong php chen bao gém: - Thuat ton sép xép chén truc tiép (straight insertion sort), - Thuat ton sép xép chén nhj phan (binary insertion sort) rong tai ligu nay ching ta chi trinh bay thu@t toén sép xép chen tryc tiép. Thuat todn sip xép chin tric tiép (Straight Insertion Sort): = Tu tudng: Dé chén phdn ti thif K+1 vao K phan tit dau day d& cé thi ty chung ta sé tién hanh. tim vj tri dang ca phan tit K+1 trong K phan tu dau bang céch van dung thuat giai tim kiém tuan ty (Sequential Search). Sau khi tim duge vj tri chén (chde chén cé vi tri chén) thi chung ta sé tién hanh chén phan tt K+1 véo ding vj tri chén bang céch dai céc phan ti ti vi tri chen dn phan ty thir K sang phai (ra phia sau) O1 vi tri va chan phan ter K+1 vao vi tri cua né. = Thust toan: BI:K=1 B2: IF (K = N) Geko trink: Cite Tuie Dit Lite ua Guidi Vhnst Thue hign Bkt B3: X = M[K+1] B4: Pos = 1 B5: IF (Pos > K) ‘Thu hign B7 B6: ELSE //Mim vi tri chen B6.1: If (X <= M[Pos]) Thue hin B7 B6.2: Pos++ B6.3: Lap lai B6.1 B7:1= K+1 IF (I> Pos) //N&i BB.1: M[l] = M[l-1] BB.2: |-- 88.3; Lap lai BB B9: ELSE //B& dai xong cac phan tif ty Pos->K vé phia sau 1 vi tri B9.1: M[Pos] = X__//Chén X vao vi tri Pos B9.2: K++ B9.3: Lap lai B2 Bkt: Két thie con phai dai cée phan ti tu Pos->K vé phia sau 1 vi tr - Cai dat thuat toan: Ham InsertionSort ¢6 prototype nhu sau: void InsertionSort(T M{J, int N); Ham thyc hién viée sép xép N phan tir cé kiéu di ligu T trén mang M theo thir ty tang dya trén thuat todn sip xép chan truc tip. Noi dung cla ham nhu sau: void InsertionSort(T Mf], int N) (int K = 1, Pos; while (K < N) {7 X=M(K]; Pos = 0; while (X > M[Pos]) Post+; for (int I= K;1 > Pos; L-) M(t) = MUI]; M[Pos] = X; Key } return; } - Vi dy minh hea thu@t toan: Gia sit ta can sép xép mang M co 10 phan tit sau (N = 10): M11 16 12 75 51 54 5 73 36 52 Ta s@ thye hign 9 lan chén (N tang ding dau day M: = 10 1 = 9) céc phan tir vao day con da c6 thif ty Trang: 34 fee ink: Oe Tole De tent Ge Phat -@ THOOO OOOO Re NPIL MBL 12 Po -@ 650000008 @@@0000000 emia = mae -@ 66000008 660000000 X= MIke l= we "@ 66800008 :$6@66000000 Re mikeil = a “66008600008 '@600600000 Geka trink: Oda Tre Be pe vt ole The X= M[K+1] = M[7] = 5 6606660008 :$660660000 M[K+1] = M[8] = 73 Pos = "0606660000 :$606660000 Xe mie T= mpl = “0606060606 "©0009 08008 emit = MOL = *@666666806 "0060600608 Thuat toan két thie: K = 10, mang M da duge sp xép theo thif ty tang Ko 2 3 4 5 6 7 8 9 10 “@@@0@@00000 Trang: 36 Guia tink: Cite Puie Dic Litu va Gidt Thue - Phan tich thuat toan: + Trung hgp t6t nhat, khi mang M ban dau da cé thi ty tang: S6 phép gan: Gmin = 2(N-1) Sé phép so sénh: Smin = 1+2+..4(Ne1) = Nx(N-1)/2 8 phép hoan vi: Hmin = 0 + Trung hgp xéu nhat, khi mang M ban dau lun cé phan tt nhé nhét trong N-K phan tif cén lai ding @ vi tri sau cing sau méi lén hoan vi $6 phép gan: Gmax = [2x(N-1)}+[ 1+2+..+(N-1)] = [2x(N-1)] + [Nx(N-1)/2] 86 phép so sanh: Smax = (N-1) Sé phép hoan vi: Hmax = 0 + Trung binh: Sé phép gan: Gavg = 2x(N-1) + [Nx(N-1)/4] S6 phép so sénh: Savg = [Nx(N-1)/2. + (N-1)]/2 = (N+2)x(N-1)/4 8 phép hoan vi: Havg = 0 + Ching ta nban thdy rng qua tinh tim kiém vj tri chen cia phan tl Kel va qua trinh di cac phan ty tif vj tri chen dén K ra phia sau O1 vi tri c6 thé két hgp lai véi nhau. Nhu vay, qué trinh di déi cae phan ti ra sau nay sé bat dau tif phan tir thir K tré vé dau day M cho dén khi gap phén tif c6 gié tri nhé hon phan ty K+1 thi ching ta déng théi vila di di xong va déng théi cling bat gap vi tri chen, Ngoaii ra, chiing ta cing cé thé tinh toan gid tr] ban dau cho K tiy thuge vao sé phan tir ding dau day M ban du cé thif ty tang la bao nhiéu phan ti chif khong hat thiét phai la 1. Khi dé, thuat todn s4p xép chan tryc tiép clia ching ta c6 thé duge higu chinh lai nhu sau: - Thu@t toan higu chinh: Bi K=1 B2: IF (M[K] <= M[K+1] And K < N) B2.1: K++ B2.2: Lap lai B2 B3: IF (K = N) Thu hign Bkt BA: X = M[K=1] BS: Pos = K B6: IF (Pos > 0 And X < M[Pos]) B6.1: M[Pos+1] = M[Pos] B6.2: Pos-- B6.3: Lap lai BE B7: ELSE //Chén X vao vi tri Pos+1 B7.1: M[Pose1] = X B7.2: Ki+ B7.3: Lap lai B3 Bkt: Két thc Ham InsertionSort] c6 prototype nhu sau: Trang: 87 Guia tink: Cite Puie Dic Litu va Gidt Thue void InsertionSorti(T Ml], int N); Ham thuc hién viée sép xép N phan tir cé kiéu di ligu T trén mang M theo thir ty tang dya trén thuat toan sép xp chén truc tigp da hiéu chinh. Noi dung cla ham but sau: void InsertionSortI(T M(], int N) { int K = 1, Pos; while(M[K-1] <= M[K] && K= 0) { M[Pos+1] = M[Pos]; Pos--; } M[Pos+1] = X; K+; } return; 3 - Vi dy minh hoa thuat toén higu chinh: Gia sit ta can sdp xép mang M cé 10 phan tty sau (N = 10): M14 16 20 75 50 5 25 75 60 50 Ban dau K = 4 nén ta sé thu hign 6 lan chén (N - 4 = 10 - 4 = 6) cac phan tit vao day con da cé thit ty tang diing déu day M: Lan K- X = M[K=1] = M5 @ 666000008 @ 666000000 @®@@@@OOOO®O Lan 2:K =5 50 Pos+1=4 Pos = X = M[K+1] = M[6] K: 1 2 3 4 5 "“®@O@@@OO08820® Xo5 KL 4 5 ©@@OO® OOOO >Pos+1=1 Trang: 38 Guia tink: Cite Puie Dic Litu va Gidt Thue K: 1 3 4 5 "*@@O@@O OG OOOO : Lan 3:K =6 X=M[K+l] = M[7]=25 Pos = 4 => Pos+1=5 Wien 6 XM O23 Ps "@@ 008 OOOO K: 1 2 3 4 se "@@O@@OOGOOOOO SS : “@©@0O0O88OO® Lan 4: K = X = M[K=1] = M(8} Pos = 7 => Pos +1=8 Ko 4 5 & “®@ @@®@ X75 Ko 5 7 "“®@@000800©® X75 Lan 5:K=8 — X= M[K+1] = M[9] = 60 Pos = 6 => Pos +1=7 Ko 2 3 4 5 7 8 "@ ® @ "© 666666600 "@ ©0080 80088 Lan 6:K=9 — X=M[Kel] = M[10] = 50_ Pos = 6 => Pos + 1=7 “© ®©©@068008 Trang: 32 Guia tink: Cite Puie Dic Litu va Gidt Thue K-50 Ko 2 3 4 5 6 a ee "@0 OGG O68 OO® Pd 2 3 4 5 6 7 8 9 "“@@O@000 80088 x Thuat ton két thac: K = 10, mang M da duge s4p xép theo thif ty tang 1 2 4 5 6 7 8 9 10 “@000000000 = Phan h thuat ton higu chinh: + Trung hgp t6t nhét, khi mang M ban dau da 6 thir ty tang: 86 phép gan: Gmin = 1 Sé phép so sh: Smin = 2x(N-1) +1 6 phép hoan vi: Hmin = 0 + Trudng hép xéu nhat, khi mang M ban dau da cé thit ty gidm dan: 86 phép gan: Gmax = 1+[1+2+.+(N-L)}+[N-1] = Nx(N+1)/2 S8 phép so sh: Smax = 1+2x{1+2+..+(N-1)]+[N-1] = N° 6 phép hoan vi: Hmax = 0 + Trung binh: Sé phép gan: Gavg = [1+ Nx(N-1)/2)/2 8 phép so sénh: Savg = [2x(N-1) + 1+N°]/2 Sé phép hoan vi: Havg = 0 3.2.4. Sdp xép bang phuong phap tron (Merge Sort) Cac thuat toan trong phan nay sé tim cach tach mang M thanh céc mang con theo céc dudng chay (run) réi sau d6 tién hanh nhap céc mang nay lai theo ting cap dudng chay dé tao thanh céc dung chay méi cé chiéu dai lén hdn dudng chay ca. Sau mot sé lan téch/ohap thi cudi cing mang M chi cén lai 1 dudng chay, lic dé thi cde phan tir trén mang M sé trd nén cé thi ty. Cac thuat ton sdp xép bing phuong phap tron bao gém: - Thuat toan sép xép tron thang hay tron tru tigp (straight merge sort), ‘Thuat toan sép xép tron ty nhién (natural merge sort) ‘Trude khi di vao chi tiét ting thuat toan ching ta hay tim hiéu khai nigm va céc vn dé lign quan dén dung chay (run) - Bung chay (Run): Day M[l], Mil+1], .., MJ] (I< J: 1 <1, J SN) la mot dudng chay néu nd c6 thirty. Trang: 40 Guia tink: Cite Puie Dic Litu va Gidt Thue - Chiu dai cia duvéng chay (Run's Length): Sé phan tix cla mét dung chay cén duge goi la chiéu dai cla duéng chay. Nhu vay: + M@i phan tif cua day la mét dutng chay cé chiéu dai bang 1 + Mét day cé thé bao gém nhiéu dung chay. + Tron cdc dung chay: Khi ta tron céc dung chay lai véi nhau sé cho ra mot dung chay méi cé chiéu dai bang téng chiéu dai céc duéng chay ban dau. 4a. Thudt todn sdp xép tron truc tiép hay tron thang (Straight Merge Sort): - Tu tudng: Ban dau day M c6 N run(s) véi chiéu dai méi run: L = 1, ta tién hanh phan phdi luan phién N run(s) cla day M vé hai day phy Templ, Temp2 (Méi day phy cé N/2 run(s)). Sau d6 tron tyéng ting ting cap run d hai day phy Templ, Temp? thanh mét run méi cé chiéu dai L = 2 dé dua vé M va day M iré thanh day cé N/2 run(s) véi chiéu dai mdi run: L = 2. Nh vay, sau mdi lan phan phi va tron céc run trén day M thi sé run trén day M sé gidm di mét nifa, déng théi chigu dai méi run sé tang gp déi. Do d6, sau Logs(N) Tan phan phdi va tron thi day M chi cén Iai 01 run véi chiéu dai la N va khi dé day M rd thanh day cé thirty, Trong thuat gidi sau, dé dé theo doi chiing ta trinh bay riéng 02 thuat gil: + Thu@t giai phan phéi ludn phién (tach) céc duéng chay véi chiéu dai L trén day M vé cde day phy Temp1, Temp2. + Thuat gidi tron (nhap) cdc cp dung chay trén Templ, Temp2 6 chiéu dai L vé M thanh céc duéng chay véi chiéu dai 2*L. - Thust toan phan phéi Bi:l= 1 //Chisé tren M B2: JI = 1 //Chi sé tren Temp! B3: J2 = 1 //Chi sé tren Temp2 B4: IF (1>N) _//a phan phdi hét Thu ign Bkt //Chép 1 run tur M sang Temp! BS: K = 1 //Chi sé dé duyét céc run BOuIF (K > L) _/Duyet hét 1 run Thyc hign B13 B7: Templ[J1] = M[l]_ //Chép céc phan ti ca run trén M sang Temp BB: le+ BO: J1s4 B10: K++ B11: IF (>) //Ba phan phéi hét Thye hin Bkt B12: Lap lai B //Chép 1 run tu M sang Temp2 Guia tink: Cite Puie Dic Litu va Gidt Thue BI3: Ke 1 B14: IF (K > L) Thye B15; Temp2[J2] = M[l] _//Chép céc phn tu ca run trén M sang Temp2 BIG: be+ BIT: J2++ B18: K++ B19: IF (I> N) _ //Ba phan phdi hét Thyc hign Bkt B20: Lap lai B14 B21: Lap lai B4 B22: NI = JI-1_//S6 phan tt trén Temp! B23: N2 = J2-1_//S6 phan tu tren Temp2 Bkt: Két thic - Thuét toan tron: Bi:1=1 //Chisé tren M B2: J1 = 1 //Chi sé trén Temp B3: J2 = 1 //Chi sé tren Temp2 B4: K1 = 1//Chi sé dé duyét céc run trén Temp! BS: K2 = 1//Chi s6 dé duyét cdc run trén Temp2 BG: IF (J1 > NI) //a chép hét céc phan tif trong Temp! Thye hign B25 BY: IF (J2 > N2) //Ba chép hét céc phan tif trong Temp2 Thye hign B30 BB: IF (Templ[J1] < Temp2{J2])__//Temp1[J1] ditng truéc Temp2[J2] tren M 8.1: M[l] = Temp1[J1] BB.2: [es B83: J++ BB.4: K1++ B8.5: If (K1 > L) //Ba duyét hét 1 run trong Temp! Thy hign B11 B8.6: Lap lai B BO: ELSE /Temp2[J2] ating truée Tempi[J1] tren M B9.1: M{l] = Temp2[J2] B9.2: I++ B9.3: J++ B9.4: K2++ B9.5: If (K2>L) //Ba duyét hét 1 run trong Temp2 Thyc hién B18 B9.6: Lap lai BE B10: Lap lai B4 //Chép phan run cén lai trong Temp2 vé M B11: IF (K2 > L) //Ba chép hét phan run cén Iai trong Temp2 vé M Lap lai B4 B12: M[l] = Temp2[J2] BI3: lee B14: J2e+ Trang: 42 Guia tink: Cite Puie Dic Litu va Gidt Thue BIB: K204 B16: IF (J2 > N2) //Ba chép hét cac phan tif trong Temp2 Thue hign B30 B17: Lap lai B11 //Chép phan run cén lai trong Temp! vé M B18: IF (K1 > L) //Ba chép hét phan run cén lai trong Temp! vé M Lap lai Ba B19: M[l] = Tempi[J1] B20: I++ B21: J++ B22: K1++ B23: IF (J1 > N1)//Ba chép hét céc phan tif trong Temp] Thye hign B25 B24: Lap lai BIB //Chép céc phan tit cén lai trong Temp2 vé M B25: IF (J2>N2) Thc hién Bkt B26: M[l] = Temp2[J2] B27: I++ B28: J2++ B29: Lap lai B25 J/Chép c&c phan tt cén Iai trong Temp! vé M B30: IF (J1>N1) Thy hin Bt B31: M(l] = Temp![J1] B32: I++ B33: J1++ B34; Lap lai B30 Bkt: Két thic - Thuat toan sdp xép tron thang: Bl: L= 1. //Chiéu dai ban déu cia cae run B2:IF (L2N) _ //Day chi cén 01 run Thye hign Bkt B3: Phan_Phéi(M, N, Temp, N1, Temp2, N2, L) B4: Tron(Temp1, N1, Temp2, N2, M,N, L) BS: L = 2*L B6: Lap lai B2 Bkt: Két thie - Cai dat thuat toan: Ham StraightMergeSort ¢6 prototype nhu sau: void StraightMergeSort(T Ml], int NN); Ham thyc hign vige sép xép N phan tt c6 kiéu di ligu T tren mang M theo thi ty tang dya trén thuat toan sép tron tryc tigp. Ham sit dung cdc ham Distribute, Merge 6 prototype va ¥ nghia nhu sau void Distribute(T MI], int_N, T Tempil], int &N1,T Temp2[], int_&N2, int_L); Trang: 43 Guia tink: Cite Puie Dic Litu va Gidt Thue Ham thy hién viée phan phdi luan phién cac duéng chay cé chiéu dai L trén day M 6 N phan tu vé thanh céc day Temp! va Temp2 cé tuong ting NI va N2 phan te. void Merge(T Temp1[J, int N1,T Temp2{J, int N2,T M(J, int &N, int L); Ham thye hién vige trén tung cap tuéng ting cae dung chay véi dé dai L tren Temp1, Temp2 vé day M thanh céc dung chay cé chiéu dai 2*L. N6i dung cia céc ham nhu sau: void Distribute(T M(J, int N,T Tempif], int &N1,T Temp2[], int &N2, int L) { int 1=0,J1 = 0, J2 = 0; while (I< N) { for(int K = 0; KeL && [eN; K++, bee, JT 44) Temp1[J1] = ll}; for(K = 0; Kel && Ie; K++, bet, J2++) Temp2[J2] = Mil}: } NI N2 return; I void Merge(T Temp], int N1,T Temp2i), int N2,T M(J, int &N, int L) { int I= 0, J1 = 0, J2=0, Kl = 0, K2 = 0; while (JI < N1 && J2 < N2) { while (Temp1[J1] <= Temp2[J2] && J1 < NI && J2 < N2) { M[l] = Tempi[J1}; less Jie if (JI == N1) { for (; J2 < N2; J2++, les) MUI] = Temp2[J2}; return; } Kes if (K1 == L) { for (; K2 < L && J2 < N2; K2e4, let, J2++) MUl] = Temp2[J2}; K1=K2=0; break; } } while (Temp2[J2] < Templ[J1] && J1 < NI && J2 < N2) { M[l] = Temp2[u2}; ay Jars; if (J2 == N2) { for (; JI < NI; 1s, Joe) Ul] = Temp 1[J1]: Trang: 44 Guia tink: Cite Puie Dic Litu va Gidt Thue return; K++; if (K2 == L) { for Kl @l 52 57S. Lan3:L=4 Trang: 46 Guia tink: Cite Puie Dic Litu va Gidt Thue Phan phéi M thanh Templ, Temp2: Temp1:N1=6 32 36 41 47. @ Temp2: N2=4 2145257) Tron Temp, Temp2 thanh M: Templ:N1-6 as a @ Temp2: N2=4 21 52. 57 65 Lan 4: L Phan phéi M thanh Temp1, Temp2: M Qi 2 36 41 Temp1: N1=8 eS ee Temp2: N2=2 50 70 Trén Templ, Temp2 thanh M: Temp: N1=8 Zo 320 (36 wl aT Temp2: N2=2 50 70 L = 16 > 10: Két thae thuat toan - Phan tich thugt toan: + Trong thuat gidi nay ching ta luén thu hién log,(N) lan phan phéi va trén cae run. Trang: 47 Guia tink: Cite Puie Dic Litu va Gidt Thue + 6 méi lan phan phéi run chung ta phai thy hién: N phép gan va 2N phép so sanh (N phép so sanh hét dung chay va N phép so sénh hét day). + G méi lan tron run chang ta cing phai thyc hién: N phép gan va 2N+N/2 phép so sanh (N phép so sénh hét duéng chay, N phép so sénh hét day va N/2 phép so sénh gia tri cdc cp tucng ting trén 2 day phy) + Trong moi truéng hgp: S6 phép gan: G = 2NxLoga(N) 6 phép so sdnh: S = (4N+N/2)xLog.(N) 6 phép hoan vi: Hmin = 0 Trong thuat gidi nay ching ta sit dung 02 day phy, tuy nhién téng sé phan ti 6 02 day phu nay cling chi bang N, do vay da tao ra syf lang phi bo nhé khong cén thigt. Dé gidi quyét vén dé nay ching ta chi cn sty dung 01 day phy song ching ta két hgp qua trinh trén céc cap run ¢6 chiéu dai L tueng ting 6 hai déu day thanh céc run cé chiéu dai 2L va phan phéi luan phién vé hai dau cia mot day phy. Sau dé ching ta déi vai tré cia 02 day nay cho nhau, + Truéc khi higu chinh lai thuat gidi chiing ta xét day M gém 10 phan tif sau dé minh hoa cho qua trinh nay: Gia sit ta can s4p xép mang M co 10 phan tit sau (N = 10): M81 63 69 74 #14 77 56 57 9 2 Ta thyc hién céc lan tron céc cp run hai dau day nay va két hgp phan phéi cde run méi tron vé hai dau day kia nhu sau: Lan 1:L=1 Trén cae cap run cé chiéu dai L trén M thanh cac run cé chiéu dai L = 2 va két hgp phan phdi luan phién céc run nay vé hai dau day Tmp: "© @©O@OO OOO © Déi vai tré cia M va Tmp cho nhau 6D @EDe ) DED Lan 2: =2 Tron céc c&p run c6 chiéu dai L = 2 én M thanh céc run c6 chiéu dai L = 4 va két hgp phan phdi luan phién céc run nay vé hai dau day Tmp: mE DS D> (« 1) GD GD Trang: 48 Guia tink: Cite Puie Dic Litu va Gidt Thue Béi val tr cla M va Tmp cho nhau Lan3:L=4 Trén cae cap run cé chigu dai L = 4 trén M thanh cdc run c6 chiéu dai L = 8 va két hgp phan phéi luan phién cac run nay vé hai dau day Tmp: Tmo 2556 SG 0 m2 s(n” 1 Déi vai tré cia M va Tmp cho nhau M Co 25 56 57 68 69 74 BI Lan 4:L=8 Tron céc cp run cé chiéu dai L = 4 trén M thanh cdc run c6 chidu dai L - 8 va két hgp phan phéi luan phién cc run nay vé hai dau day Tmp: M oo 2 56 57 63 69 74 8D 7 14 Tmp: 4 25 «5657, 63 69> GTC Déi vai tré cla M va Tmp cho nhau M: 4 2 «956 «57 63 69S L = 16 > 10: Két thae thuat toan + Nhu vay, trong thuat giai nay chting ta chi cén thao tac tron céc cp run c6 chiéu dai L tuéng Ung @ hai dau day thanh mét run méi cé chiéu dai 2L dé dua vé day phy. Vén dé 1a chung ta sé luan phién dat run méi vao dau day phy (theo thi ty tang) va cudi day phy (theo thif ty gidm). Tuc la hai buéc trén va phan phéi da dude két hgp lai véi nhau. Thuét gidi higu chinh nhu sau: - Thu§t ton Trgn - Phan phéi cdc c§p dung chay: Bi: 11 =1 // Chi s6 tir dau day M B2: 12 = N // Chi sé ti cudi day M B3: JI = 1 // Chi sé ti dau day Temp B4: J2 = N// Chi sé ti cudi day Temp BD: Head = True // Cé bao phia dat run mdi trong qua trinh trén - phan phéi BE: K1 = 1// Chi sé dé duyét céc run dau day M BY: K2 = 1// Chi sé dé duyét céc run cudi day M BB: IF (I1_> 12) __// Ba tron va phan phéi hét céc run Trang: 42 Guia tink: Cite Puie Dic Litu va Gidt Thue Thue hién Bkt B9: IF (MIU1] < M[I2})_—_// M1] dting trade M12] trén Temp B9.1: If (Head = True) B9.1.1: Temp[J1] = M[I1] B9.1.2: J++ B9.2: Else 9.2.1: Temp[J2] = M[I1] B9.2.2: J2- B9.3: [14+ B9.4: If (I1 > 12) Thye hign Bkt B9.5: K1++ B9.6; If (K1>L) //Ba duyét hét 1 run phia dau trong M Thue hién B11 B9.7; Lap lai BS B10: ELSE J/ M12] ating truée M{N1] trén Temp. B10.1: If (Head = True) B10.1.1: Temp[J1] = M[l2] B10.1.2: J++ B10.2: Else B10.2.1: Temp[J2] = M(l2] B10.2.2: J2-- B10.3: 12 B10.4: If (I1 > 12) Thyc hign Bkt B10.5: K2++ B10.6: If (K2 > L) //Ba duyét hét 1 run phia sau trong M Thye hién B18 B10.7: Lap lai BO //Chép phan run cén lai d phia sau trong M vé Temp B11: IF (K2 > L) //Ba chép hét phan run cén Jai d phia sau trong M vé Temp B1L.1: Head = Not(Head) B11.2: Lap lai BG B12: IF (Head = True) B12.1: Temp[J1] = M[l2] B12.2: J++ B13: ELSE B13.1: Temp[J2] = M[l2] B13.2: J2- B14: 12-- B15: If (II > 12) Thye hin Bkt BI6: K2++ B17: Lap lai B11 1}Chép phan run cén Iai é phia truéc trong M vé Temp B18: IF (K1 > L) //Ba chép heét phan run cn lai 8 phia trudc trong M vé Temp Trang: 50 Guia tink: Cite Puie Dic Litu va Gidt Thue B18.1: Head = Not(Head) B18.2: Lap lai B6 B19: IF (Head = True) B19.1: Temp[J1] = M[l] B19.2: J++ B20: ELSE B20.1: Temp[J2] = M{l1] 20.2: J2- B2I: I++ B22: If (I1 > 12) Thye hign Bkt B23: K1++ B24: Lap lai BIB Bkt: Két thic - Thudt toan sap xép tron thang higu chinh: BI:L= 1 //Chiéu dai ban dau cia céc run B2:IF (L>N) _ //Day chi con 01 run Thy hién Bkt 3: Trén_Phan_Phéi(M, N, Temp, L) Ba: L = 2*L BS: IF (L > N) J Chép céc phan tur tir Temp vé M B5.1:1=1 B5.2: IF (I> N) Thue hién Bkt B5.3: M[l] = Temp[l] B5.4: [es B5.5: Lap lai B5.2 B6: Trén_Phan_Phéi(Temp, N, M, L) B7: L = 24L BB: Lap lai B2 Bkt: Két thie lat thuat t su chinh: Ham StraightMergeSortModify c6 prototype nhu sau: void StraightMergeSortModify(T MI], int); Ham thyc hin viée sép xép N phan tif c6 kiéu dif ligu T trén mang M theo thi ty tang dya trén thuat ton sép trén tryc tiép da hiu chinh, Ham sit dung ham MergeDistribute cé prototype va ¥ nghia nhwt sau: void MergeDistribute(T M{J, int N,T Templ], int L); Ham thyc hin vie tron cac cap run cé chiéu dai L ¢ hai déu day M thanh mot run 6 chiéu dai 2L va phan phdi luan phién céc run cé chigu dai 2L nay vé hai du day Temp. Noi dung ca ham nhu sau: void MergeDistribute(T MJ, int N,T Templ, int L) Trang: 51 Guia tink: Cite Puie Dic Litu va Gidt Thue { int 11 © 0,12 = N-1, JI = 0, J2 = N-1, KI = 0, K2 = 0, Head = 1) while (I <= 12) {while (M[l1] <= M(I2] && 11 <= 12) {if (Head == 1) { Temp[J1] = M{t1]; Jl } else { Temp[J2] = MII1]; 2 3 Mas; if (II > 12) break; Kees if (K1 == L) { for ()K2 < L && IT <= 12; K244, [2--) if (Head == 1) { TemplJ1] = M(l2]; Jd 4 else { Temp[J2] = M{l2}; 2 } Head = 0-Head; K1=K: break; i , while (M{I2] <= M{l1] && II <= 12) { if (Head == 1) { TemplJ1] = M{I2]; Jd } else { Temp[J2] = M[I2]; 2-5 3 Ta; iF (11 > 12) break; K++; if (K2 == L) { for KI < L && Mee 12; Kl++, I++) if (Head == 1) { Temp[J1] = {I}; Sle Trang: 52 Guia tink: Cite Puie Dic Litu va Gidt Thue } else { Temp[J2] = MUNI] } return; } void StraightMergeSortModify(T MI], int N) {int Le 1; T* Temp = new TIN] if (Temp == NULL) return; while (L < N) { MergeDistribute(M, N, Temp, L); L=2*L; i(L>=N) { for (int I= 0; 1 < N; I++) MUI] = Templl}; break; ) MergeDistribute(Temp, N, M, L); L=2¢L; , delete Temp; return; } - Phan tich thu@t toan higu chin! + Trong thuat gidi nay ching ta luén thy hign log,(N) lan tron - phan phéi céc run + Méi lan tron-phan phéi chung ta phai thyc hign: N phép gan va N+N/2+N/2-2N phép so sénh. + Trong moi truéng hgp: ‘86 phép gan: G = NxLog,(N) S8 phép so sinh: S = 2NxLog.(N) 6 phép hoan vi: Hmin = 0 + Nhu vay thuat giai tron thang higu chinh vita tiét kiém bé nhé, vifa thufc hién nhanh hon thuat giai trén théng ban dau. + Tuy nhién, trong thuat giai tron thang ching ta da thyc hign vige phan phéi va tron cac cap dung chay cé chigu dai c6 dinh ma trong thy té tren day céc duéng Trang: 53 Geko trink: Cite Tuie Dit Lite ua Guidi Vhnst chay c6 thé c6 chidu dai lén hon. Digu nay sé gidm bét sé ln phan phéi va tron céc cap dung chay cho ching ta. Thuat giai trén ty nhién dugc trinh bay sau day sé loai bé dude nhuge diém nay cua thuat gidi trén thang 6. Thudt todn sp xép trén ty nhién (Natural Merge Sort): - Tu tudng: Tan dung cdc duéng chay ty nhién 6 sin trén day, tién hanh trén tung ung cic cp dung chay ty nhién nam hai déu day M thanh mot duéng chay méi va phan phéi luan phién céc duéng chay méi nay vé hai ddu day phy Temp. Sau dé lai tiép tuc tron tung ting tling cap run & hai déu day phy Temp thanh mét run mdi va phan phéi luan phién run méi nay vé hai ddu day M. Cif tiép tye nbut vay cho dén khi tren. Mhoac trén Temp chi cn lai 01 run thi két thc. - Thu@t ton Trdn — Phan phéi cdc cp dung chay ty nhi Bi: 11 = 1 // Chi sé tu dau day M B2: 12 = N // Chi s6 tir cusi day M B3: J1 = 1//Chi sé ti dau day Temp B4: J2 = N// Chi s6 ti cudi day Temp BS: Head = True // C3 béo phia dat run méi trong qua trinh tr6n - phan phéi BG: IF (I1 > 12) _// Ba tron va phan phéi hét céc run Thye hign Bkt B7: IF (M[L1] < Mfl2}) —_// MII] diing trude MfI2} trén Temp B7.1: If (Head = True) B7.1.1: Temp[J1] = M[I1] B7.1.2: J++ B7.2: Else B7.2.1: Temp[J2] = M[I1] B7.2.2: J2-- B7.3: [14+ B7.4: If (11 > 12) Thy hign Bkt B7.5: If (M[I1] < M[l1-1]) //B& duyeét hét 1 run phia dau trong M Thy hign BO B7.6: Lap lai B7 BB: ELSE // MI2] ding truéc M[l1] tren Temp B8.1: If (Head = True) BB.1.1: Temp[J1] = M[I2] BB.1.2: JI++ B8.2: Else B8.2.1: Temp[J2] = M[l2] 8.2.2: J2-- BB.3: [2-- B8.4: If (11 > 12) Thye hién Bkt Trang: 54 Guia tink: Cite Puie Dic Litu va Gidt Thue 8.5: If (M{I2] < M[I2+1]) /7B& duyet hét 1 run phia sau trong M Thyc hién B15 B8.6: Lap lai B7 //Chép phan run cén lai d phia sau trong M vé Temp B9: IF (M(I2] < M[I2+1]) //Ba chép hét phan run cén lai & phia sau trong M vé Temp B9.1: Head = Not(Head) B9.2: Lap lei BS B10: IF (Head = True) B10.1: Temp[J1] = M(l2] B10.2: JI++ B11: ELSE B1L.1: Temp[J2] = M[l2] B1L.2: J2-- B12: 12. B13: IF (I> 12) Thye hign Bkt B14: Lap lai B9 //Chép phan run cén Iai d phia truéc trong M vé Temp B15: IF (Mjl1]< M[I1-1]) //B8 chép hét phan run cén lai phia truéc trong M vé Temp B15.1: Head = Not(Head) B15.2: Lap lai B6 B16: IF (Head = True) B16.1: Temp[J1] = M[l1] B16.2: J++ BI7: ELSE B17.1: Temp[J2] = M(t] B17.2: J2-- B18: I++ B19: IF (Il> 12) Thy hign Bkt B20: Lap lai BIS Bkt: Két thic - Thu@t ton sdp xép tron ty nhién: Bi: L = 1 //Khdi tgo chiéu dai ban déu cda run dau tién //Tim chiéu dai ban déu cia run dau tien B2: IF (N < 2) B2.1: LeN B2.2: Taye hign Bit B3: IF (M[L] sM[L+1] And L < N) B3.1: Le+ B3.2: Lap lai B3 B4:IF (L=N) —_//Day chi cén 01 run Thy hién Bkt BS: Trén_Phan_Phdi(M, N, Temp, L) B6: IF (L=N) Guia tink: Cite Puie Dic Litu va Gidt Thue Ji Chép céc phan ty tu Temp vé M B6.1: = B6.2: If (I> N) Thye hién Bkt B6.3: M{l] = Templl] B6.4: B6.5: Lap lai B6.2 BY: Tron_Phan_Phéi(Temp, N, M, L) BB: Lap lai B4 Bkt: Két thic -¢ lat thuat toan trn ty nhién: Ham NaturalMergeSort 6 prototype nhu sau: void NaturalMergeSort(T MI], int N); Ham thuc hign viée sép xép N phan tif c6 kigu dif ligu T trén mang M theo thi ty tang dya trén thugt todn sép tron tryc ty ohién, Ham st’ dung ham NaturalMergeDistribute cé prototype va y nghia nhu sau: Void NaturalMergeDisteibute(T M(], int N, T Templ], int &L); Ham thyc hign vige tron céc cp run 6 hai déu day Mma run dau tien c6 chiéu dai L thanh mét run mdi chiéu dai én hdn hoac bang L va phan ph nay vé hai dau day Temp. Noi dung cua ham nhy sau: luan phign run méi void NaturalMergeDistribute(T M{], int N,T Temp[], int &L) { int I= 0,12 =N-1, JI = 0, J2 = N-1, Head = 1, FirstPair while (II < 12) {while (M(I1] <= M(l2] &é& 11 < 12) ( if (Head == 1) { Temp[J1] = M{t1}; Jdet } else { Temp[J2] = MINI]; 2 i Mss: if (M{LI] < Mpt1-1)) { while (M(I2] <= M[I2-1] && [2 > [1) { if (Head == 1) { Temp[J1] = MII2}; Jets if (FirstPai Lets ) } else { TemplJ2] = M(I2}; 2-5 d Trang: 56 Guia tink: Cite Puie Dic Litu va Gidt Thue 2. 3 if (Head == 1) { Temp[Ji] = M[l2|; less If (FirstPair == 1) Lets else { Temp[J2] = M(I2]; 2-5 } -; FirstPair = 0; if (M1 > 12) return; Head break; — Head; if (II == 2) { Temp[J1] = M{l1}; if (1 == N-1) Len; return; ) while (M{I2] <= M{l1] && 11 < 12) {if (Head == 1) { Temp[J1] = M{I2}; J1et if (FirstPair == 1) Less } else { Temp[J2] = Mfl2]; S25 12--; if (M{I2] < M[I2+1]) { while (M[I] <= M[I1+1] && [1 < 12) {if (Head == 1) { Temp[J1] = MII}; Jie; else { Temp[J2} = MIN]; 2-5 Trang: 57 Guia tink: Cite Puie Dic Litu va Gidt Thue Tse; 3 if (Head == 1) { Temp[Ji] = MILI]; dss : else { Temp[J2] = MIU}; Jo } Tet FirstPair = 0; if (U1 > 12) return; Head = 0 - Head; break; ) ) iF (II == [2 { Temp[J1] = M(I1}; if (11 == N-1) Len; return; } return; void NaruralMergeSortl(T M(], int N) { int L=1; while (M[L-1] < M[L] && LeN) Liss T* Temp = new TIN]: if (Temp == NULL) return; while (L < N) { NaturalMergeDistribute(M, N, Temp, L); if (L == N) ( for (int = 0; 1 < N; le+) M[l] = Templl}; break; } NaturalMergeDistribute(Temp, N, M, L); } delete Temp; return; Trang: 58 Guia tink: Cite Puie Dic Litu va Gidt Thue 3 -Vidy Gia sit ta can sp xép mang M cé 10 phan tty sau (N = 10): M51 39° 45 «55 20 15 20 17 40 10 ‘inh hoa thugt toan: Ta thyc hién cdc lén tron céc cap run ty nhién 6 hai déu day nay va két hop phan phéi céc run méi tron vé hai dau day kia hu sau: Lan i:L=1 Tron céc cp run ty nbién c6 chigu dai L1 = 1 va L2 = 2 trén M thanh céc run c6 chiéu dai L = 3 va két hgp phan phéi luan phién cdc run nay vé hai déu day Tmp: OED OOD Déi vai tré cla M va Tmp cho nhau Lan 2: =3 Tron cdc cap run ty nhién c6 chiéu dai L1 = 3 va L2 = 5 trén M thanh céc run c6 chiéu dai L = 8 va két hgp phan phéi luan phién cdc run nay vé hai déu day Tmp: Tmo 17 20394045 SCD Di vai tré cla M va Tmp cho nhau m Co 2% 39 40 (4551S Lan 3: -8 Tron céc cap run ty nbién c6 chigu dai L1 = 8 va L2 = 2 trén M thanh céc run cd chiéu dai L = 10 va két hgp phan phéi luan phién céc run nay vé hai déu day Tmp: By 2 3% 4 4 51 5 Ti M: Tmpcid 1517 20239 45 3 éi vai ré cla M va Tmp cho nhau mM O15 17 202039 5 Guia tink: Cite Puie Dic Litu va Gidt Thue L = 10: Két thac thuat toan - Phan tich thugt toan tron ty nhién: + Trong trung hgp tét nhét, khi day cé this ty tang thi chung ta khéng phai qua bude phan phéi va tron nao hét Sé phép gan: Gmin = 1 S6 phép so sénh: Smit 8 phép hoan vi: Hmin 2(N-1) +2 = 2N oO + Trong truéng hgp xau nhét, khi day 6 thir ty gidm 4 nifa dau va cé thif ty tang & nia cudi va 6 méi buéc tron phan phéi thi d6 dai duéng chay méi cing chi tang gp di. Trong truéng hgp nay sé gidng nhu thuat todn tron thdng da higu chinh: ‘86 phép gan: Gmax = NxLog,(N)+1 8 phép so sénh: Smax = 2NxLoga(N)+2 Sé phép hoan vi: Hmin = 0 + Trung bioh: Sé phép gan: Gavg = NxLog,(N)/2+1 Sé phép so sénh: Savg = NxLog,(N) + N+ 1 Sé phép hoan vi: Havg = 0 = Lug: + Trong thuat toén nay ching ta cing cé thé sif dung 2 day phy Templ, Temp2 nhu. trong thuat ton tron tric tiép, khi 46 chung ta lu6n ludn duyét tt dau dén cudi céc day chi khéng can thiét phai duyét tu hai dau day vao giifa. Tuy nhién, trong trudng nay thi bé nhé trung gian sé tén nbiéu han, + Trong céc thuat ton sép xép theo phucng phap trdn, vigc sif dung nhigu day phy 6 thé lam gidm bét sé lin phan phéi va tron cdc run. Tuy nhién, vie quan ly cae day phy sé phic tap han. 3.3. Cae gidi thudt sdp xép ngoai (Sap xép trén tap tin) 6 day, do sé phan tu dif ligu thuéng Ién nén mét phan dif ligu cén sép xép duge dua vao trong bé nhé trong (RAM), phan cén lai duge Iuu tris & bé nhé ngoai (DISK). Do vay, téc d6 sp xép dir ligu trén tap tin tvong déi cham. Cac giai thuat sép xép ngoai bao gém cdc nhém sau - Sp xép bang phucng phép tron (merge sort), - Sp xép theo chi muc (index sort). Nhu vay trong phan nay chuing ta tim cach sp xép tap tin F c6 N phan ti dif ligu c6 kiéu T (khéa nhén dién cac phan tir dif liéu cé kiéu T) theo thif ty tang. 3.3.1. Sdp xép bang phuong phap tron (Merge Sort) Tung ty nhu déi véi s4p xép theo phusng phép tron trén mang, trong céc thuat gidi & day chung ta sé Um cach phan phéi cc duéng chay trong tap tin dit ligu vé cc tap tin trung gian va sau dé lai tron tugng ting cac cap duéng chay tren céc tap tin trung gian thanh mét duéng chay méi cé chiéu dai lén han. Trang: 60) Geko trink: Cite Tuie Dit Lite ua Guidi Vhnst Cae thuat toan sp xép bling phucng phap tron trén tap tin bao gdm: - Thuat toan sp xép tron thang hay tron tru tigp (straight merge sort), - Thuat toan sp xép tron ty nhién (natural merge sort), - Thuat todn tron da Idi can bang (multiways merge sort), ‘Thuat toan trén da pha (multiphases merge sort) 6 day chang ta chi nghién cdu hai thuat toan tron dau tién. 4a. Thugt todn sip xép tron true tiép (Straight Merge Sort): = Tu tuéng: Tugng ty nhu thust todn trdn true tiép trén mang, ban dau tép tin Fd ¢6 NN run(s) vai chiéu dai méi run; L = 1, ta tién hanh phan phéi luan phién N run(s) cila tap tin Fd vé K tap tin phu Ftl, Ft2, .., FC (Méi tép tin phu ¢6 N/K run(s)). Sau dé tron tusng Xing ting bé K run(s) 6 K tap tin phy FU, Ft2, ... FtK thanh mét run méi cé chiéu dai L = K dé dua vé tap tin Fd va tap tin Fd ted thanh tap tin c6 N/K run(s) véi chigu dai mdi run: L = K. Nhu vay, sau mdi lan phan phéi va tron céc run trén tap tin Fd thi sé run trén tap tin Fd sé gidm di K lan, déng théi chigu dai mdi run trén Fd s@ tang len K lan. Do dé, sau Logx(N) ln phan phéi va tron thi tap tin Fd chi cén lai 01 run véi chiéu dai la N va khi dé tap tin Fd tré thanh tap tin 6 thi ty. Trong thuat gidi nay, dé dé theo déi ching ta str dung 2 tap tin phy (K = 2) va qua trinh phan phéi, trén céc run dude trinh bay riéng thanh 2 thuat giai: + Thuat giai phan phdi luan phién (tach) cée dung chay véi chiéu dai L tren tap tin Fd vé hai tap tin phy Ftl, Ft2; + Thuat giai tron (nhap) céc cap dudng chay trén hai tap tin Ftl, Ft2 c6 chiéu dai LL vé tap tin Fd thanh céc duéng chay véi chiéu dai 2*L; Gia sit rang céc 161 thao tac trén tap tin sé bj bé qua trong qué trinh thyc hién. - Thudt toan phan phéi B1: Fd = fopen(DataFile, “t”) _//Mé tap tin dif ligu cn sdp xép dé doc di ligu B2: Ftl = fopen(DataTempl, “w") _//Mé tap tin trung gian thi nhat dé ghi dit eu B3: Ft2 = fopen(DataTemp2, “w") __//Mé tap tin trung gian thi hai dé ghi di liéu B4: IF (feof(Fd)) //Ba phan phéi hét Thye hign Bkt //Chép 1 run tt Fd sang Ftl BS: K = 1 //Chi sé dém dé duyét cae run BG: IF (K>L) —_//Duyét hét 1 run Thye hign B12 B7: fread(&a, sizeof(T), 1, Fd) //Boc 1 phan tir cla run trén Fd ra bién tam a BB: fwrite(&a, sizeof(T), 1, Ftl) //Ghi gia tri bién tam a vao tap tin Ft] B9: Kes B10: IF (feof(Fa)) //ba phan phdi hét Thye hin Bkt B11: Lap lai BS //Chép 1 run tit Fd sang Ft2 B12: K =1 Trang: 61 Guia tink: Cite Puie Dic Litu va Gidt Thue B13: IF B14: BIS: BIG: BIT: BIB: BIS: Bkt: (> L) Thye hién B19 |: fread(é&a, sizeof(T), 1, Fd) {Boe 1 phan tit cia run trén Fd ra bién tam a : fwrite(&a, sizeof(T), 1, Ft2) _//Ghi gid tri bién tam a vao tap tin Ft2 : Ket IF (feof(Fd)) //ba phan phdi hét Thye hign Bkt : Lap lai B13 : Lap lai B4 Kat thac - Thuat toan trgn: BL Ba: B3: Ba: BS: BE: BT: Be: IF Bo: Ftl = fopen(DataTempl, “r") —_//Md tp tin trung gian thi nhat dé doc diz Fi2 = fopen(DataTemp2, *r”) _//Mé tap tin trung gian thif hai dé doc dir lieu Fd = fopen(DataFile, “w") //Mé tap tin dif ligu dé ghi div liéu fread(&al, sizeof(T), 1, Ft1) //Boc 1 phan te cua run trén Ftl ra bién tam al fread(&a2, sizeof(T), 1, Ft2) //Doc 1 phan tif cla run trén Ft2 ra bign tam a2 Ki=1 JIChi s6 dé duyét cae run tren Ft K2-1 /IChi s6 48 duyét céc run tren Ft2 (al < 22) [Jal ding truée a2 tren Fd BB. 1: fwrite(&al, sizeof(T), 1, Fd) B8.2: K1++ B8.3: If (feof(Ft1)) //Ba chép hét cdc phan tt trong Ftl Thuc hign B23 B8.4: fread(&al, sizeof(T), 1, Ftl) B8.5: If (K1 > L) _//Ba duyét hét 1 run trong Ftl Thue hign B11 B8.6: Lap lai BB ELSE jf a2 ding teude al trén Fd B9.1: fwrite(&a2, sizeof(T), 1, Fd) B9.2: K2++ B9.3: If (feof(Ft2)) //Da chép hét cac phan tif trong Ft2 Thyc hién B27 B9.4: fread(&a2, sizeof(T), 1, Ft2) BO.5: If (K2 > L) _//Da duy@t hét 1 run trong Ft2 Thyc hién B17 B9.6: Lap lai BB B10: Lap lai B6 1iChép phan run cén lai trong Ft2 vé Fd B11: IF (K2 > L) //B& chép hét phan run cén lai trong Ft2 vé Fd Lap lai BS B12: fwrite(&a2, sizeof(T), 1, Fd) B13: K2++ B14: IF (feof(Ft2))___//Ba chép hét cdc phan tif trong Ft2 BIS: BIé: Thue hién B27 fread(&a2, sizeof(T), 1, Ft2) Lap lai B11 Trang: 62 Guia tink: Cite Puie Dic Litu va Gidt Thue 7/Chép phan run con lai trong Ftl vé Fd B17: IF (K1 > L) //Ba chép hét phan run cén lai trong Ftl vé Fd Lap lai BB B18: fwrite(&al, sizeof(T), 1, Fd) BI9: K1++ B20: IF (feof(Ftl)) _//Ba chép hét céc phan tt trong Ft Thye hign B23 B21: fread(&al, sizeof(T), 1, Ftl) B22: Lap lai BIT //Chép céc phan tif cén lai trong Ft2 v8 Fd B23; fwrite(&a2, sizeof(T), 1, Fd) B24: IF (feof(Ft2)) Thye hién Bkt B25: fread(&a2, sizeof(T), 1, Ft2) B26: Lap lai B23 //Chép cc phan tif cén lai trong Ftl vé Fa B27: fwrite(&al, sizeof(T), 1, Fd) B28: IF (feof(Ft!)) Thu hign Bkt B29: fread(&al, sizeof(T), 1, Ftl) B30: Lap Iai B27 Bkt: Két thie - Thust toan sp xép trgn thang: Bl: L= 1. //Chiéu dai ban dau cla cde run B2:1F (L>N) _//Tap tin Fd chi cén O1 run Taye hign Bkt B3: Phan_Phéi(DataFile, DataTempl, DataTemp2, L) B4: Tron(DataTemp1, DataTemp2, DataFile, L) BS: L = 24. B6: Lap lai B2 Bkt: Két thie -c gt thugt toa: Ham FileStraightMergeSort cé prototype nhu sau: int FileStraightMergeSort(char * DataFile); Ham thyc hién viée sp xép cde phan ti cé kigu dif ligu T trén tap tin 6 tén DataFile theo thé ty tang dya trén thuat toan sép tron truc tiép. Néu viec sép xép thanh céng ham tra vé gid tri 1, trong trudng hgp ngugc lai (do 6 Ii khi thye hién cc thao téc trén tap tin) ham tra vé gié tri -1. Ham st dung cac ham FileDistribute, FileMerge cé prototype va y nghia nhu sau: int FileDistribute(char * DataFile, char * DataTemp!, char * DataTemp2, int L); Ham thy hign vige phan phéi luan phién cdc dung chay cé chiéu dai L trén tap tin di ligu cé ten DataFile vé cho céc tap tin tam théi cé tén tudng ding la DataTemp! Guia tink: Cite Puie Dic Litu va Gidt Thue va DataTemp2. Ham tra vé gid tri 1 néu viée phan phéi hoan tat, trong trudng hop ngugc lai ham tra vé gid tri -1 int FileMerge(char * DataTempl, char * DataTemp2, char * DataFile, int L); Ham thyc hién viée tron tiing cap tung ting céc dung chay véi do dai L trén hai tap tin tam théi cé tén DataTempl, DataTemp2 vé tap tin dif ligu ban dau cé tén DataFile thanh cc duéng chay 6 chiéu dai 2*L. Ham tré vé gié tri 1 néu viée tron hoan tat, trong truing h¢p ngu¢c lai ham tra vé gid tr - C8 hai ham nay déu sif dung céc ham Finished dé lam nhiém vy “don dep” (déng cc tap tin da md, hiy vung nhé da cp phat, ..) va tra vé mot gid tri nguyén dé két thic, Cac ham Finished c6 prototype nhu sau: int Finished (FILE * Fl, int ReturnValue); int Finished (FILE * Fl, FILE * F2, int ReturnValue); int Finished (FILE. * F1, FILE * F2, FILE * F3, int ReturnValue); N6i dung cia céc ham nhu sau: int Finished (FILE * Fl, int ReturnValue) { fclose (F1); return (ReturnValue); } int Finished (FILE * F1, FILE * F2, int ReturnValue) { felose (F1); felose (F2); return (ReturnValue); } I int Finished (FILE * F1, FILE * F2, FILE * F3, int ReturnValue); { felose (F1); fclose (F2); felose (F3); return (ReturnValue); int FileDistribute(char * DataFile, char * DataTempl, char * DataTemp2, int L) { FILE * Fd = fopen(DataFile, “tb"); if (Fd == NULL) return (-1); FILE * Ftl = fopen(DataTempl, “wt if (Ful == NULL) return(Finished(Fd, -1)); FILE * Ft2 = fopen(DataTemp2, “wb"); if (Ft2 == NULL) return(Finished(Fd, Ftl, -1)); Ta Trang: 64 Guia tink: Cite Puie Dic Litu va Gidt Thue int SOT = sizeof(T); while (!feof(Fd)) { for(int K = 0; KeL && Ifeof(Fd); K++) { int t = fread(&a, SOT, 1, Fd); if(t <1) {if (feof(Fd)) break; return (Finished(Fd, Ftl, Ft2, -1)); } t = fwrite(&a, SOT, 1, Ftl); if(t<1) return(Finished(Fd, Fel, Ft2, -1)); ) for(K = 0; K2) thi céc thuat toan tron dude goi la tron da [6i (multiways) va sé lam gidm sé lan phan phéi - tron. cae duéng chay, tue 1a lam gidm sé lan doc va ghi dia. + Cn hu y 1a théi gian thyc hign cdc thuat gidi sdp xép/tim kiém trén tép tin phy thude rat nhiéu vao céc thao téc doc va ghi dia Trang: 62 Guia tink: Cite Puie Dic Litu va Gidt Thue b. Thudat todn sdp xép trén ty nhién (Natural Merge Sort): - Tu tudng: Tung ty nhu thuat ton tron ty nhién trén mang, ching ta tan dung céc duéng chay ty nbién ban dau trén tap tin Fd 6 chiéu dai khong cé dinh, Tién hanh phan phi Juan phién cdc duéng chay ty nhién nay cia tap tin Fd vé 2 tép tin phy Ftl, Ft2. Sau 6 trén tudng ting ting cap duéng chay ty nhién é 2 tap tin phy Ftl, Ft2 thanh mét dung chay méi c6 chiéu dai bang téng chiéu dai cia cap hai duéng chay dem tron va dua vé tap tin Fd Nhu vay, sau méi lan phan phéi va tron céc duéng chay ty nhién trén tap tin Fd thi s6 dung chay ty nhién trén tp tin Fd sé gidm di mét ntla, déng théi chiéu dai cac duéng chay ty nhién cing duge tang lén. Do dé, sau t6i da Log,(N) lan phan phdi va tron thi tap tin Fd chi cén Iai 01 duéng chay véi chigu dai la N va khi dé tap tin Fd tré thanh tép tin 6 thet ty. Trong thuat gii nay chung ta sti dung 2 tap tin phu (c6 thé ste dung nhiéu hon) va qué trinh phan phéi, tron céc dudng chay ty nhién duge trinh bay riéng biét thanh 2 thuat giai: + Thuat giai phan phdi luan phién (tach) cdc duéng chay ty nhién trén tap tin Fd vé hai tap tin phy Ftl, Ft2; + Thuat gidi tron (nhap) céc cap dung chay ty nhién trén hai tap tin Ftl, Ft2 vé tap tin Fd thanh céc duéng chay ty nhién véi chiéu dai Ién han; va chting ta cing gia si rang céc I6i thao tac trén t€p tin sé bj bé qua. - Thuat ton phan phéi: BI: Fd = fopen(DataFile, “r") _//Mé tap tin div lieu cén sp xép dé doc di lieu B2: Ftl = fopen(DataTemp!, “w") _//Mé tap tin trung gian thi nhét dé ghi di lieu B3: Ft2 = fopen(DataTemp2, “w") _//Mé tap tin trung gian thit hai dé ghi dir ligu B4: IF (feof(Fd)) //B& phan phi hét Thye hién Bkt BS: fread(&a, sizeof(T), 1, Fd) //Doc 1 phan tif cla run trén Fd ra bign tam a J/Chép 1 dudng chay ty nhién tix Fd sang Ft BG: fwrite(&a, sizeof(T), 1, Ft1) //Ghi gia tri bién tam a vao tap tin Ft B7: IF (feof(Fd)) //Ba phan phi hét Thy hien Bkt BB: fread(&b, sizeof(T), 1, Fd) //Doc tiép 1 phan tif ca run trén Fd ra bién tam b BO: IF (a>b) —_// Da duyét hét 1 dung chay ty nhién B9.1: a= //Chuyén vai tr ca b cho a B9.2: Thyc hién B12 B10: a=b B11: Lap lai B6 //Chép 1 dung chay ty nhién tu Fd sang Ft2 B12: fwrite(&a, sizeof(T), 1, Ft2) __//Ghi gié tri bign tam a vao tép tin Ft2 B13: IF (feof(Fa)) //Ba phan phdi hét Thue hin Bkt Trang: 70 Guia tink: Cite Puie Dic Litu va Gidt Thue B14: fread(&b, sizeof(T), 1, Fd)//Dgc 1 phan tif ca run trén Fd ra bién tam b BI5:IF (a>b) _// Ba duyét hét 1 dung chay ty nhién B15.1: a = b// Chuyén vai tré cua b cho a B15.2: Thye hign B18 Bl6:a=b B17: Lap lai B12 BI8: Lap lai B6 Bkt: Két thac + Thuat toan trn: BI: B2: BT: BB: Ftl = fopen(DataTempl, “r”) _//Mé tap tin trung gian this nhét dé doc dit ligu Ft2 = fopen(DataTempe, *r") _//Mé tap tin trung gian thif hai dé doc di lieu Fd = fopen(DataFile, “w") //Mé tap tin div ligu dé ghi div iu : fread(&al, sizeof(T), 1, Ftl) /MBec 1 phén tif cla run trén Ftl ra bién tam al : fread(&a2, sizeof(T), 1, Ft2) //Doc 1 phan ti cua run trén Ft2 ra bign tam a2 IF (al < a2) if al dting trade a2 tren Fd B6.1: fwrite(&al, sizeof(T), 1, Fd) B6.2: If (feof(Ft1)) //Ba chép hét céc phan tu trong Ft1 Thyc hign B21 —_//Chép cc phan ti cén lai trong Ft2 vé Fd B6.3: fread(&bl, sizeof(T), 1, Ftl) //Doc tip 1 phan tir trén Ft ra bién tam bl B6.4: If (al > bl) //Ba duyét hét dung chay ty nhién trong Ftl B6.4.1:al=bl ——_// Chuyén vai tré cia bl cho al B6.4.2: Thyc hign BS B6.5: al = bl B6.6; Lap lai BG ELSE J] a2 ding teuée al trén Fd B7.1: fwrite(&a2, sizeof(T), 1, Fd) B7.2: If (feof(Ft2)) // Ba chép hét céc phan tif trong Ft2 Thye hién B25 _// Chép cc phan tu cén lai trong Ftl vé Fd B7.3: fread(&b2, sizeof(T), 1, Ft2) //Boc tiép 1 phan tit trén Ft2 ra bign tam b2 B7.4: If (a2 > b2)_// Ba duyét hét dudng chay ty nhién trong Ft2 B7.4.1:a2=b2 —_// Chuyén vai tro cuia b2 cho a2 B7.4.2: Thyc hign B15 B7.5: a2 = b2 B7.6: Lap lai B7 Lap lai BE JiChép phan dung chay ty nhién can lai trong FX2 vé Fd Bo: fwrite(&a2, sizeof(T), 1, Fd) B10: IF (feof(Ft2)) _// Ba chép hét céc phan ti trong Ft2 Bil Thyc hién B25 _//Chép cdc phan ti cén lai trong Ftl vé Fd fread(&b2, sizeof(T), 1, Ft2) B12: IF (a2 > b2) 1/ DA chép hét 1 dung chay ty nhién trong Ft2 BI2.1; a2 = b2 B12.2: Lap lai B6 B13: a2 = b2 B14: Lap lai BO Trang: 7 Guia tink: Cite Puie Dic Litu va Gidt Thue //Chép phan duéng chay ty nbién cén lai trong Ftl vé Fa B15; fwrite(&al, sizeof(T), 1, Fd) B16: IF (feof(Ftl)) __// Da chép hét cdc phan tt trong Ftl Thyc hién B21__//Chép cdc phan tir cén lai trong Ft2 vé Fd B17: fread(&bl, sizeof(T), 1, Ftl) B18: IF (al > bl) // B& chép hét 1 dudng chay ty nhién trong Ftl B18.1: al =b1 B18.2: Lap lai B6 B19: al = bl B20: Lap lai BIS 1/Chép céc phan tit cén lai trong Ft2 vé Fd B21: fwrite(&a2, sizeof(T), 1, Fd) B22: IF (feof(Ft2)) Thy hign Bkt B23; fread(&a2, sizeof(T), 1, Ft2) B24: Lap lai B21 //Chép cdc phan ti cén lai trong Ftl vé Fd B25: fwrite(&al, sizeof(T), 1, Fa) B26: IF (feof(Ftl)) Thyc hién Bkt B27: fread(&al, sizeof(T), 1, Ftl) B28: Lap lai B25 Bkt: Két thic - Thu@t ton sdp xép tron ty nhién: BI: L = Phén_Phdi(DataFile, DataTemp1, DataTemp2) B2:IF (L2N) __ //Tap tin Fd chi cén 01 run Thye hin Bkt B3: L = Tron(DataTemp!, DataTemp2, DataFile) B4: IF (L>N) _//T@p tin Fd chi cdn 01 run Thye hign Bkt BS: Lap lai B1 Bkt: Két thie -¢ lat thuat toa Ham FileNaturalMergeSort c6 prototype nhy sau: int FileNaturalMergeSort(char * DataFile); Ham thyc hign vige sp xép céc phan ti c6 kidu dif ligu T tren tap tin c6 ten DataFile theo thi ty tang dya trén thuat toan sdp tron ty nhién. Néu viée sép xép thanh céng ham tra vé gié tri 1, trong truéng hgp nguge Iai (do ¢6 16i khi thy hién cc thao tac trén tap tin) ham tra vé gié tri -1. Ham st dung cc ham FileNaturalDistribute, FileNaturalMerge c6 prototype va y nghla nhu sau: int FileNaturalDistribute(char * DataFile, char * DataTempl, char * DataTemp2); Ham thyc hin viée phan phéi luan phién céc duéng chay ty nhién trén tap tin dir ligu c6 tén DataFile vé cho cdc tap tin tam thai 6 tén tong ting la DataTempl va Trang: 72 Guia tink: Cite Puie Dic Litu va Gidt Thue DataTemp2. Ham tra vé gid tri la chigu dai cla dudng chay ty nhién dau tién trong tap tin dir ligu DataFile néu viéc phan phéi hoan tat, trong truéng hgp nguge lai ham 1rd vé gid tri int FileNaturalMerge(char * DataTemp!, char * DataTemp2, char * DataFile); Ham thy hign viéc tron tling cap tucng ting cac dung chay ty nhién trén hai tép tin tam théi c6 tén DataTemp!, DataTemp2 vé tap tin dif ligu ban dau c6 tén DataFile thanh céc duéng chay cé chiéu bang téng chiéu dai 2 duéng chay dem tron, Ham. tr vé chigu dai cia duéng chay ty nhién dau tién sau khi tron trén t4p tin DataFile néu vige tron hoan tét, trong trudng hgp nguge lai ham tra vé gié tri -1. Noi dung iia céc ham nhu sau: int FileNaturalDistribute(char * DataFile, char * DataTemp1, char * DataTemp2) ( FILE * Fd = fopen(DataFile, “rb”); if (Fd == NULL) return (-1); FILE * Ftl = fopen(DataTemp1, “wb"); if (Ftl == NULL) return (Finished (Fd, -1)); FILE * Ft2 = fopen(DataTemp2, “wb"); if (Ft2 == NULL) return (Finished (Fd, Ft, -1)); Tab; int SOT = sizeof(T); int L = 0, FirstRun! = 1; if (fread(&a, SOT, 1, Fd) < 1) if (Feof(Fa)) return (Finished(Fd, Ft1, Ft2, 0)); return (Finished (Fd, Ftl, Ft2, -1)); } while (lfeof(Fd)) {do { int t = fwrite(&a, SOT, 1, Ftl); if(te 1) return (Finished (Fd, Ft1, Ft2, if (FirstRunl == 1) Let; t= fread(&b, SOT, 1, Fd); if(te1) {if (feof(Fd)) break; return (Finished (Fd, Ftl, Ft2, -1)); } if(a>b) (ab; break; Trang: 73 Guia tink: Cite Puie Dic Litu va Gidt Thue while (1); if (feof(Fd)) break; do { int t = fwrite(&a, SOT, 1, Ft2); if(t <1) return (Finished (Fd, Ftl, Ft2, -1)); t = fread(&b, SOT, 1, Fd); if(t< 1) {if (feof(Fd)) break; return (Finished (Fd, Ftl, Ft2, -1)); } if (a> b) (a=b; FirstRunl = 0; break; } a=b; } while (1); } return (Finished (Fd, Ft1, Ft2, L); } Was int FileNaturalMerge(char * DataTempl, char * DataTemp2, char * DataFile) ( FILE * Fd = fopen(DataFile, "wb"); if(Fd == NULL) return(-1); FILE * Ftl = fopen(DataTempl, "rb"); if(Ftl == NULL) return(Finished(Fd, -1)); FILE * Ft2 = fopen(DataTemp2, "rb"); if(Ft2 == NULL) return(Finished(Fd, Ft1, -1)); int al, a2, bl, b2; if (fread(&al, SOT, 1, Ft) < 1) return(Finished(Fa, Ftl, Ft2, -1)); if (fread(&a2, SOT, 1, Ft2) < 1) return(Finished(Fd, Ftl, Ft2, -1)); int L = 0; int FirstRun1 = 1, FirstRun2 while(Ifeof(Ftl) &é& Ifeof(Ft2)) { if (al <= a2) { int t = fwrite(&al, SOT, 1, Fd); it(te1) return(Finished(Fd, Ftl, Ft2, -1)); if (FirsRunl == 1) Trang: 74 Guia tink: Cite Puie Dic Litu va Gidt Thue Less t= fread(&b1, SOT, 1, Ftl); if (<1) { if (feof(Ft1)) break; return(Finished(Fd, Ft1, Ft2, -1)); } if (al > bl) { do { t= fwrite(&a2, SOT, 1, Fd); if (t <1) return(Finished(Fd, Ft1, Ft2, -1)); if (FirstRun2 == 1) Less t = fread(&b2, SOT, 1, Ft2); if (t <1) {if (Feof(Ft2)) ( FirstRun2 = 0; break; } return(Finished(Fd, Ftl, Ft2, -1)); ) if (a2 > ba) {. FirstRun2 «= 0; a2 = b2; break; , , while(1); al = bl; FirstRun 1 = 0; if (feof(Ft2)) break; } al = bl; } else { int t = fwrite(&a2, SOT, 1, Fd); if(t <1) return(Finished(Fd, Ftl, Ft2, -1)); if (FirstRun2 == 1) Les; t= fread(&b2, SOT, 1, Ft2); if(t <1) {if (feof(Ft2)) break; return (Finished(Fd, Ft, Ft2, -1)); } if (a2 > b2) Trang: 75 Guia tink: Cite Puie Dic Litu va Gidt Thue { do { t= fwrite(&al, SOT, 1, Fd); if (t <1) return(Finished(Fd, Ft1, Ft2, -1)); if (Fri == 1) Lets t= fread(&b1, SOT, 1, Ftl); if(t <1) {if (feof(Ft1)) ( FirstRun! break; i return(Finished(Fd, Ftl, Ft2, -1)); ) if (al > bl) { FirstRun! = 0; al = bl; break; ) } while(1); a2 = b2; FirstRun2 = 0; if (feof(Ft1)) break; } a2 = b2; ) } while ({feof(Ft1)) { int t = fwrite(&al, SOT, 1, Fd); if(t<1) return(Finished(Fd, Ft, Ft2, -1)); if (FirstRun1 == 1) Lets t= fread(&al, SOT, 1, Ft); if(t<1) (if (feof(Ft1)) break; return(Finished(Fd, Ftl, Ft2, -1)); ) while (Ifeof(Ft2)) { int t = fwrite(&a2, SOT, 1, Fd); if (t <1) return(Finished(Fd, Ft1, Ft2, -1)); t = fread(&a2, SOT, 1, Ft2); Trang: 76 Guia tink: Cite Puie Dic Litu va Gidt Thue if(t <1) { if (feof(Ft2)) break; return(Finished(Fd, Ftl, Ft2, -1)); , 3 return(Finished(Fd, Ftl, Ft2, L)); } I int FileNaturalMergeSort(char * DataFile) { int Fhd = open(DataFile, O.RDONLY); if (Fhd < 0) return (-1); int N = filelength(Fhd)/sizeof(T); close (Fhd); if (N<2) return (1); char * Temp char * Temp2 = “Data2.Tmp”; int L = do{ L = FileNaturalDistribute(DataFile, Temp1, Temp2); if (L == -1) { remove(Temp1); remove(Temp2); return (-1); } if (L == N) break; L = FileNaturalMerge(Temp!1, Temp2, DataFile); if (L == -1) { remove(Temp1); remove(Temp2); return (-1); 3 if (L ==) break; } while (L < N); remove(Temp1); remove(Temp2); return (1); } = Vi dy minh hea thugt toan sép xép tr6n ty nl Gia str da liu ban dau trén tap tin Fd nhu sau: go 24 5 12 11 2 2 15 10 35 35 18 4 1 Ta tign hanh phan phéi va trén ede duéng chay ty nbién: Trang: 77 Guia tink: Cite Puie Dic Litu va Gidt Thue Lan 1: L Phan phdi luén phién cae dudng chay ty nhién trén Fd vé Ftl va Ft2: Fd 80 24 5 12 lf 2.2 15 JO 35 35 18 4 Ft: g0 5 12 2 2 15 18 1 6 Fi2: 24 1 10 35 35 4 Trén céc cap duéng chay ty nhién tuéng ting trén Ft] va Ft2 thanh cc duéng chay ty nhién trong d6 duéing chay ty nhién dau tien cé chiéu dai L = 2 va dua vé Fd: Fi: 80 5 12 2 2 15 18 1 6 Fe: 24 1 10_35_35 4 Fd: 24 80 Lan 2:L =2 i 12 2 1015 18 35 35 Phan phéi luan phién céc duéng chay ty nhién trén Fd vé Ftl va Ft2: Fa 24 80 5 i/ 12 2 2 10 15 18 35 35 1 4 6 Fel: 24 80 2.2 10 15 18 35 35 Fa 5 1 12 1 4 6 Tron céc c§p dung chay ty nhién tuong ting trén Ft va Ft2 thanh céc dung chay tw nhién trong dé dung chay ty nhién dau tien cé chiéu dai L = 5 va dua vé Fd: Ftl: 24 80 22 10 15 18 35 35 F2: 5 I) 12 1 4 6 Fd 5 11 12 24 80 1 2 2 4 6 10 15 18 Lan 3:1 =5 Phan phdi ludn phién cdc dudng chay ty ohién trén Fd vé Ftl va Ft2: Fd: 5 11 12 24 890 1 2 2 4 6 10 15 18 35 35 Ft: 5 11 12 24 80 2.2 4 6 10 15 18 3! Tron céc c&p dudng chay ty nhién tuéng ting trén Ftl va Ft2 thanh céc duéng chay ty nhién trong dé dutng chay ty nhién dau tién cé chiéu dai L = 15 va dua vé Fa. Thuat todn két thic: Fea: 35 Fil: 5 11 12 24 80 Fi: 2.2 4 6 10 15 18 35 35 Fa: 2.2 4 5 6 10 M1 12 15 18 24 35 35 80 - Phan tich thuat toan: + Trong truang hgp tt nhét, khi day c6 this ty tang thi sau khi phn phéi lan ther nhat thuat todn két thuc, do do: $6 lin doc ~ ghi dia: Dmin = N Trang: 78 Guia tink: Cite Puie Dic Litu va Gidt Thue Sé phép so sénh: Smin = 2N + Trong trudng hgp xéu nhat, khi day 6 thif ty giém va 6 méi buée trén phan phéi thi d6 dai duéng chay méi cing chi ting gp déi. Trong truding hdp nay sé giéng hu thuat toan tron trye tiép: Sé lan doc va ghi dia: Dmax = 2NxLogs(N) Sé phép so sénh: Smax = (4N + N/2)*Logs(N) + Trung binh: S6 lan doc va ghi dia: Davg = NxLoga(N) + N/2 Sé phép so sénh: Savg = (2N + N/4)xLoga(N) +N 3.3.2. Sdp xép theo chi myc (Index Sort) ‘Thong thudng kich thie cla céc phan ti dif ligu trén tap tin di ligu kha Ién va kich thudc cia t€p tin dif ligu cling Ién. Va lai bién dng dif ligu trén tap tin dif ligu it lin tuc ma chu yéu la ching ta truy xuét dif ligu thuéng xuyén. Do vay, viée doc - ghi nhiéu len tap tin dif ligu sé lam cho théi gian truy xut tap tin dif ligu rat mat nhiéu théi gian va khéng bao dam an toan cho dif ligu. Dé gidi quyét van dé nay chung ta tién hanh thao tac tap tin div ligu thong qua mot tap tin tuan ty chi myc theo khéa nhan dién ca cae phan tir dit I a, Tu tung: Tw tap tin dif ligu ban dau, ching ta tién hanh tgo tap tin chi myc theo khéa nhén dign cua céc phan te dif ligu (Tap tin chi muc dugc sép xép tang theo khéa nhén i@n ca céc phan tif dif liéu). Trén co sd truy xuat lan ligt céc phan tif trong tap tin chi muc chting ta sé diéu khién trat ty xuét hién cia céc phan ty dif ligu trong tap tin di ligu theo ding trét ty trén tap tin chi myc. Nhu vay trong thuc tién, tap tin dif ligu khéng bi thay déi thi ty vat ly ban dau trén dia ma chi bj thay déi trat ty xuat hién cc phan tif dif ligu khi duge ligt ké ra man hinh, may in, Vé edu tric cde phan tl trong tép tin chi mye thi nhu da trinh bay trong phn tim kiém theo chi myc (Chuong 2). O day chung ta chi trinh bay cach tao tgp tin chi muc theo khéa nhén dién tif tap tin dif ligu ban dau va cach thie ma tap tin chi muc sé diéu khién thi ty xuat hién cua caéc phan tu dif ligu trén tap tin di ligu. Hai theo tac nay sé duge trinh bay rigng thanh hai thu@t toan: - Thuat todn tao tap tin chi muc - Thuat toan digu khign th ty xuat hign céc phan ty dif ligu dya trén tép tin chi myc. b, Thudt todn: - Thugt todn tao tp tin chi myc B1: Fd = open(DataFile, “r") //Mé tap tin dif ligu dé doc dit ligu B2: Fidx = open(IdxFile, “w") _// Mé dé tao mdi tap tin chi muc B3: CurPos = 0 Bd: read (Fd, a) B5: IF (EOF (Fd)) Thye hién B11 BE: ai.Key = a.Key Trang: 72 Guia tink: Cite Puie Dic Litu va Gidt Thue B7: ai.Pos = CurPos B8: write (Fidx, ai) B9: CurPos += SOT B10: Lap lai B4 B11: close (Fd) B12: close (Fidx) B13: FileNaturalMergeSort(IdxFile) Bkt: Két thac - Thugt toan diéu khién thif ty xuat hién cac phn tif dif ligu dya trén tgp tin chi myc B1: Fd = open(DataFile, “r") //Mé tap tin dif ligu dé doc div igu B2: Fidx = open(IdxFile, “r”) // Mé tap tin chi myc dé doc B3: read (Fidx, ai) B4: IF (EOF (Fidx)) Thue hign B9 B5: seek(Fd, ai.Pos) B6: read (Fd, a) B7: Output (a) /IKit I phan tit dir ligu méi doc duge B8: Lap lai B3 B9: close (Fd) B10: close (Fidx) Bkt: Két thac c. Cati dat thugt todn: Ham Createlndex thyc hién vigc tao tap tin chi muc tu tap tin dif ligu va sp xép cdc phan ti trong tap tin chi myc theo thif ty tang theo khéa nhén dién. Néu viec tao tap tin chi myc thanh céng, ham tra vé gid tri 1, ngugc lai ham tra vé gia tri -1. Ham Createlndex ¢é prototype nhu sau: int Createlndex (char * DataFile, char * IdxFile); N@i dung cua ham Createindex: int Createlndex (char * DataFile, char * IdxFile) { FILE * Fd = fopen (DataFile, “rb"); if (Fd == NULL) return (-1); FILE * Fidx = fopen (IdxFile, “wb"); if (Fidx == NULL) return (Finished (Fd, -1)); DataType a; [dxType ai; int SOT = sizeof(DataType); int SOI « sizeof(ldxType); long CurPos = 0; while (!feof(Fd)) { if (fread (&a, SOT, 1, Fd) < 1) (if (feof(Fd)) break; return (Finished (Fd, Fidx, -1)); Trang: 80 Guia tink: Cite Puie Dic Litu va Gidt Thue ) ai.Key ai.Pos = CurPos; if (fwrite (&ai, SOL, 1, Fidx) < 1) return (Finished (Fd, Fidx, -1)); CurPos += SOT; 3 felose (Fd); fclose (Fidx); if (FileNaturalMergeSort({dxF ile) { remove (IdxFile); return (-1); t return (1); } Ham DisplayData thyc hign digu khién thi ty xudt hign cée phan tt diy ligu tren tap tin dif li@u dya trén tap tin chi muc da duge tao. Néu vie liét ké thanh céng, ham tra vé gia tri 1, ngugc lai ham tra vé gid tri -1. Ham DisplayData cé prototype nhu sau: int DisplayData (char * DataFile, char * [dxFile); N6i dung cua ham DisplayData: int DisplayData (char * DataFile, char * [dxFile) = fopen (DataFile, “rb”); NULL) return (-1); FILE * Fidx = fopen (IdxFile, “rb"); if (Fidx «= NULL) return (Finished (Fd, -1)); DataType a: ldxType ai; int SOT = sizeof(DataType); int SOI = sizeof(ldxType); while (!feof(Fidx)) {if (fread (&ai, SOl, 1, Fidx) < 1) {if (feof(Fidx)) return (Finished (Fd, Fidx, 1)); return (Finished (Fd, Fidx, -1)); , fseek(Fd, aiPos, SEEK_SET); if (fread (&a, SOT, 1, Fd) < 1) return (Finished (Fd, Fidx, -1)); Output(a); } return (Finished (Fd, Fidx, 1)); } = Lug: Trang: 81 Guia tink: Cite Puie Dic Litu va Gidt Thue Ham Output thye hign vie xudt théng tin ca mét phan ti dif ligu ra thiét bi xudt théng tin. Ngoai ra, néu ching ta muén xtt ly dir ligu trong phan tr dit ligu nay theo thi ty diéu khign béi tap tin chi muc thi ching ta cing cé thé viét mét ham thye hign thao tac xif ly thay cho ham Output nay d, Phan tich thugt todn: Trong thuat ton nay chung ta phai thy hién ft nhét 01 lan tao tép tin chi myc. Dé tao t€p tin chi muc ching ta phai thyc hign N lan doc ~ ghi dia. Khi thyc hign viéc ligt ké cc phan tix dir ligu chung ta cing phai thyc hién 2N lan doc dia. Nhuge diém [dn nhét trong thuat toan nay la chting ta phai cap nhét lai tap tin chi myc khi c6 su thay déi dit ligu trén t4p tin def lieu. C4u hai va Bai tap 1. Trinh bay tu tung cia cc thuat toan sdp xép? 2. Trong céc thuat toan s4p xép ban thich nhat la thugt todn nao? Thuat ton néo ban khéng thich nhat? Tai sao? 3. Trinh bay va cai dat tat cd céc thuat todn sép xép ngi, ngoai theo thif ty giém? Cho nban xét vé céc thuat toan nay? 4. Hay trinh bay nhiing wu khuyét diém cia méi thuat todn sp xép? Theo ban céch khde phuc nhiing nhuge diém nay la nhu thé nao? 5. Sit dung ham random trong C dé tgo ra mét day M cé 1.000 sé nguyén. Van dung cc thuat toan sép xép dé sp xép cac phan tty cla mang M theo thi ty tang dn vé mat gid tri. Véi cing mét dif ligu nhu nhau, cho biét théi gian thyc hién céc thuat toan? Cé nhan xét gi déi véi céc thuat todn s4p xép nay? Ban hay dé xudt va cai dat thugt toan Quick-Sort trong truéng hgp khéng ding 4¢ quy? 6. Thong tin vé méi sé hang cla mot da thie bac n bao gém: Hé sé - 18 mot s6 thc, Bac - la mét sé nguyén c6 gid tri tir 0 dén 100, Hay dinh nghia cau tric dif ligu dé luu trit cae da thite trong bé nhé trong ca méy tinh. Véi cau trae dif lieu da duge dinh nghia, hay van dung mot thuat toan sép xép va cai dat chucng trinh thyc hién vige sdp xép cdc sé hang trong da thifc theo thif ty tang dan cla céc bac. 7. Thong tin vé céc phéng thi tai mét hdi déng thi bao gdm: Sé phéng - la mét sO nguyén cé gia tri tt 1 dén 200, Nha - la mét chif céi in hoa ty A — Z, Kha nang chifa - la mét sé nguyén cé gia tri te 10 > 250. Hay dinh nghia c&u tric dif ligu dé uu trir cde phéng thi nay trong b6 nhé trong cia may tinh. Véi cu trac dif ligu da duge dinh nghia, van dyng cac thuat toan sép xép va cai dat chung trinh thyc hign vige cdc cong viée sau: - Sap xép va in ra man hinh danh sach cac phong thi theo thi ty gidm dan vé Kha nang chifa - Sp xép va in ra man hinh dan séch cée phéng thi theo thir ty tang dan theo Nha (Tif A > Z), cc phéng cling mét nha thi sép xép theo thi ty tang dan theo Sé phéng Trang: B2 Guia tink: Cite Puie Dic Litu va Gidt Thue ~ Sap xép va in ra man hinh danh sach céc phéng thi theo thi ty tang dan theo Nha (Ti A + Z), cae phéng cing mot nha thi sp xép theo thif ty gidm dan theo Kha nang chia 8. Tao tap tin dit ligu SONGUYEN.DAT gém 10000 6 nguyén. Van dung céc thuét toan sap xép trén file, hay cai dat chuéng trinh dé sp xép dif ligu trén tap tin nay theo the ty tang dan vé gié tr] cua cac s6 nguyen trong dé. Cho biét thai gian thye hign méi thuat ton? Cé nhan xét gi déi véi cdc thuat toan nay? 9. Thong tin vé mot sinh vien bao gém: Ma sé — 1a mot s6 nguyén ducng, Ho va dem - la mot chudi cé téi da 20 ky ty, Tén sinh vién ~ la mot chudi cé téi da 10 ky ty, Ngay, théng, nam sinh - la céc sé nguyén duong, Phai - La “Nam” hoac “Nu”, Diém trung binh - la céc sé thyc cé gid tri tir 0.00 — 10.00. Viét chuéng trinh nhap vao danh sach sinh vién (it nhét la 10 sinh vién, khéng nhép tring ma giifa céc sinh vien véi nhau) va luu trit danh sach nay vao tap tin cé tén SINHVIEN.DAT, sau dé van dung cac thuat toan sdp xép trén file dé sp xép danh séch sinh vién theo thi ty tang dan theo Ma sinh vién. In danh sach sinh vién trong file SINHVIEN.DAT sau khi sép xép ra man hinh, 10, Vi tap tin dif ligu c6 tén SINHVIEN.DAT trong bai tap 9, thyc hign céc yéu cdu sau: - Tao cée t€p tin chi myc theo céc khéa trong cae trudng hgp sau + Chi myc s4p xép theo Ma sinh vien tang dan; + Chi muc sp xép theo Ten sinh vién tiv A > Z, néu ciing tén thi sp sép Ho va dem theo thir ty tA > Z; + Chi muc sp xép theo Bim trung binh gidm dan. - Luu céc tép tin chi myc theo céc khéa nhu trong ba truéng h¢p néu trén vao trong dia véi céc tan tucng ting 14 SVMASO.IDX, SVTH.IDX, SVDTB.IDX. - Dy vao céc t€p tin chi mu, in ra toan b6 danh séch sinh vién trong tap tin SINHVIEN.DAT theo ding thtt su sp xép quy dinh trong cdc t4p tin chi myc, = C6 nhan xét gi khi thyc hign viée sp xép dif ligu trén t€p tin theo chi muc. 11. Trinh bay va cai dat céc thuat toan dé cap nhét lai tap tin chi myc khi tap tin dir ligu bj thay déi trong céc trudng hep sau: - Khi thém 01 phan tu dir ligu vao tap tin dir lieu. - Khi hy 01 phén ti dur ligu trong tap tin dir ligu. - Khi hiéu chinh thanh khéa chi myc cia 01 phan ty dif ligu trong tap tin dif ligu. 12. Trinh bay va cai dat cac thuat toan dé minh hoa (m6 phéng) cac bude trong qua trinh sp xép dif ligu cho céc thuat todn sap xép néi (Sif dung céc giao dién dé hoa dé cai dat), Trang: 85 Guia tink: Cite Puie Dic Litu va Gidt Thue Chuong 4: DANH SACH (LIST) 4.1. Khai nigm vé danh sch Danh sach la tap hdp cac phan ti cé kiéu dif li¢u xac dinh va gitfa chang cé mét méi lign he nao 46 ‘Sé phan tu cla danh sach goi la chiéu dai cua danh sach. Mét danh sach cé chiéu dai bang 0 la mét danh sach réng. 4.2. Céc phép ton trén danh sdch Tay thude vao dac diém, tinh chat cia ting logi danh sach ma méi logi danh séch cé thé c6 hode chi cn thiét c6 mét sé phép toan (thao téc) nhat dinh nao dé. Néi chung, trén danh sch thung cé céc phép toan nhuf sau: - Tao méi mét danh sch: Trong thao tac nay, ching ta sé dua vao danh sch néi dung cla céc phan tt, do vay chiéu dai cla danh sach sé duge xc dinh. Trong mét sé truéng hgp, ching ta chi cn khdi tao gid tri va trang thai ban dau cho danh sach. = Thém mét phén tif vao danh séch: Thao téc nay nham thém mét phan ty vao trong danh sach, néu viéc them thanh Ong thi chiéu dai cba danh sach sé tang lén 1. Cing tiy thuéc vao ting loai danh sch va tiing truéng hgp cu thé ma vie thém phan tir s@ duge tién hanh déu, cudi hay gitfa danh sch - Tim kim mét phan tif trong danh sacl Thao téc nay sé van dung céc thuat todn tim kiém dé tim kiém mét phan ti trén danh sch théa man mét tiéu chudn nao dé (thuéng la tiéu chudn vé gi tri). - Logi bé bét mét phan tif ra khdi danh sach: Nguige véi thao téc thém, thao tac nay sé loai bé bét mot phan tra khéi danh séch do vay, néu vige loai bd thanh cong thi chiéu dai cla danh séch cing bj glam xudng 1. Théng thudng, trudc khi thyc hign thao tac nay chiing ta thuéng phai thye hién thao tac tim kiém phan tit cén logi bd. = C§p nhét (eita déi) gié tr] cho mét phan tif trong danh ach: Thao tac nay nham sta déi ndi dung ciia mot phan tit trong danh séch. Tudng ty nh thao tac loai bd, truéc khi thay déi thuéng chting ta cing phai thyc hign thao tac tim kiém phan tlr can thay déi = Sip xép thit ty cac phan tif trong danh sach: Trong thao téc nay chung ta sé van dung céc thuat toan sép xép dé sp xép cae phan tit tren danh sach theo mét trét ty xac dinh. - Tach mét danh sach thanh nhigu danh sach: Trang: 84 Guia tink: Cite Puie Dic Litu va Gidt Thue Thao tac nay thyc hién viée chia mét danh sch thanh nhiéu danh sach con theo mét tiéu thie chia nao dé. Két qué sau khi chia la téng chiéu dai trong céc danh séch con phai bang chiu dai cla danh séch ban dau. - Nh§p nhiéu danh sach thanh mt danh sach: Nguige vdi thao tac chia, thao tac nay tin hanh nhap nhiu danh sch con thanh mét danh séch 6 chiéu dai bang téng chiéu dai cae danh sch con. Tay vao tling truding hgp ma viée nhap c6 thé la + Ghép néi dudi céc danh séch lai véi nhau, + Tron xen ln céc phan tif trong danh sch con vao danh sach Ién theo mot trat ty nhat dinh, = Sao chép m@t danh sach: Thao tac nay thye hién viée sao chép toan b6 néi dung cia danh séch nay sang mét danh sch khdc sao cho sau khi sao chép, hai danh séch cé noi dung gidng het nhau = Hily danh sach: Thao tac nay sé tién hanh hy bé (x6a bd) toan bd céc phan tt trong danh sach. Vigc x6a bé nay tly vao ting loai danh sch ma cé thé la x6a bd toan bé néi dung hay c@ n6i dung lan khéng gian b6 nhé Iau trir danh sach. 4.3. Danh sach déc (Condensed List) 4.3.1, Dinh nghia Danh sach dic la danh sch ma khéng gian b6 nhé lu tri cée phan tir duge dat lien tiép nhau trong b6 nhé. 4.3.2. Biéu dién danh sdch dac Bé biéu dign danh séch dac ching ta sir dung mot day (mang) céc phan tir c6 kiéu dor ligu la kigu diy ligu ca cdc phan ti trong danh sch, Do vay, chting ta cén biét trude sO phan ty tdi da cia mang cing chinh la chiéu dai t6i da cua danh séch thong qua mot hang s6 nguyén. Ngoai ra, do chiéu dai cla danh sach ludn luén bién dong cho nén ching ta cing cén quan ly chiéu dai thyc cla danh séch thong qua mét bién nguyén. Gia str ching ta quy uéc chiéu dai tdi da cul danh sach dgc 18 10000, khi dé céu tric dir ligu dé biéu dién danh sich dae nhu sau: const int MaxLen = 10000; // hoa: fidefine MaxLen 10000 int Length; T CD_LIST[MaxLen}; j[hoac: T * CD_LIST = new T[MaxLen]; Néu chiing ta sif dung cd ché cdp phat dong dé cp phat b6 nhé cho danh sich dac thi can kiém tra sy thanh cng cla viée cép phat déng. 4.3.3. Cac thao tac trén danh sach dic 6 day cé nhiéu thao tac da duge trinh bay é cac chuong trudc, do vay chung ta khong trinh bay Igi ma chi ligt ké cho cé hé théng hoae trinh bay tém tat nhiing ndi dung chinh ciia céc thao tac nay. Trang: 85 Guia trink: Cite Tuie Dit Lipa vd Gidd Thudt Cac thao tac cd ban trén danh sach dac nhu sau: a. Khéi tao danh sch (Initialize): Trong thao tac nay chi dén gidn la chiing ta cho chiéu dai ca danh séch vé 0. Ham khéi tao danh sach dae nhu sau: void CD_Initialize(int &Len) { Len = 0; return; } b. Tao méi danh sdch/ Nhdp danh sch: Ham CD_Create_List cé prototype: int CD_Create_List(T M[], int &Len); Ham tao danh sach dac cé chiéu dai téi da MaxLen. Ham tra vé chiéu dai thyc cua danh sdch sau khi tao. N@i dung cua ham nhu sau: int CD_Create_List(T Ml), int &Len) { if (Len > MaxLen) Len = MaxLen; for (int i= 0; i < Len; iv+) M[i} = Input_One_Element(); return (Len); } Luts J: Ham Input_One_Element thy hign nhap vao ngi dung cia mét phan tif c6 kiéu di ligu T va tra vé gid tri cla phan ty méi nhap vao. Tuy vao ting truéng hgp cy thé ma chiing ta viét ham Input_One_Element cho phu hgp. c. Thém m6t phan tit vio trong danh séch: Gia sit ching ta cn thém mét phan tit c6 gié tri NewValue vao trong danh sch M 6 chiéu dai Length tai vi tri InsPos. - Thugt toan: B1: IF (Length = MaxLen) Thue hign Bkt {/D8i cac phan ti tif vi tri InsPos->Length ra sau mét vi tri B2: Pos = Length+1 B3: IF (Pos = InsPos) Thye hi¢n B7 B4: M[Pos] = M[Pos- 1] B5: Pos-- B6: Lap lai B3 B7: MllnsPos] = NewValue //Dua phan ti cé gia tri NewValue vao vi tri InsPos B8: Length++ /fTang chiéu dai cla danh sch Jen 1 Bkt: Két thac Trang: 86 Guia tink: Cite Puie Dic Litu va Gidt Thue - Cai dat thuat toan: Ham CD_Insert_ Element c6 prototype: int CD_Insert_Element(T M(], int &Len, T NewValue, int InsPos); Ham thye hign vige chén phan tif c6 gia tr] NewValue vao trong danh sach M cé chigu dai Len tai vj tri InsPos. Ham tra vé chigu dai thye ca danh sch sau khi chén néu vie chén thanh cng va ngugc lai, ham tré vé gia tri -1. NGi dung cla ham nhu sau: int CD_Insert_Element(T M[], int &Len, T NewValue, int InsPos) ( if (Len == MaxLen) return (-1); for (int i = Len; i > InsPos; Mp] = MU]; M[InsPos] = NewValue; Lens; return (Len); ) d. Tim kiém mét phan tit trong danh séch: Thao tac nay chiing ta sif dung céc thuét toan tim kiém néi (Tim tuyén tinh hoac tim nbj phan) da dugc trinh bay trong Chuéng 2. e. Logi bé bét m6t phan tit ra khéi danh sdch: Gia str chang ta can loai bé phan tu tai vi tri DelPos trong danh sach M cé chiéu dai Length (Trong mét sé truéng hgp cé thé ching ta phai thyc hién thao tac tim kiém dé xac dinh vj tri cua phan tu can xéa). - Thuat toan: B1: IF (Length = 0 OR DelPos > Len) Thyc hién Bkt [/Dai cdc phan ts tit vi tri DelPos+ 1->Length ra truée mot vi tr B2: Pos = DelPos B3: IF (Pos = Length) Thye hién B7 B4: M[Pos] = M[Pos+1] BS: Pos++ B6: Lap lai B3 B7: Length-- 1Giamn chiéu dai cia danh sach di 1 Bkt: Két thic ~ Cai dgt thugt toan: Ham CD_Delete_Element c6 prototype: int CD_Delete_Element(T MI], int &Len, int DelPos); Ham thyc ign viéc xéa phan ti! tai vi tri DelPos trong danh sach M c6 chiéu dai Len. Ham tré vé chiéu dai thye ca danh séch sau khi x6a néu viée x6a thanh céng va nguige Iai, ham tra vé gié tri -1. N@i dung ca ham nhu sau: Trang: 87 Guia tink: Cite Puie Dic Litu va Gidt Thue int CD_Delete_Element(T Ml], int &Len, int DelPos) { if (Len == 0 I! DelPos >= Len) return (-1); for (int i = DelPos; i < Len-1; i++) MUil = Mli+1); Len--; return (Len); , S. Cap nhGt (sita déi) gid tri cho mét phan tit trong danh séch: Gia sit ching ta cén sita déi phan tii tai vi tri ChgPos trong danh séch Mcé chiéu dai Length thanh gia tri méi NewValue. Thao tac nay chi dgn gid la vige gén lai gié tri méi cho phan tix can thay déi: M[ChgPos] = NewValue; Trong mét sé trugng hgp, truéc tién ching ta phai thyc hién thao tac tim kiém phan tt can thay déi gié tr] dé xéc dinh vj tri cla né sau 46 mdi thyc hign phép gan nhu tren g. Sdp xép thit tu cdc phan tit trong danh séch: Thao tac nay ching ta sif dung céc thuat todn sp xép néi (trén mang) da trinh bay trong Chusng 3. h. Tach m6t danh séch thanh nhiéu danh séch: Tay thudc vao ting yéu cau cu thé ma viée tach mot danh séch thanh nhiéu danh sch c6 thé thyc hign theo nhting tigu thifc khac nhau: + Cé thé phan phéi luan phién theo cae duéng chay nhu da trinh bay trong cde thuat toan sp xép theo phuong phép tron 6 Chuang 3; + C6 thé phan phéi luan phién ting phan cla danh sach cdn tach cho cc danh séch con, O day ching ta sé trinh bay theo céch phan phéi nay; + Tach cée phan tif trong danh sach théa man mét diéu kién cho truée Gia sit ching ta cn tach danh séch M cé chiéu dai Length thanh cac danh sach con SMI, SM2 c@ chiéu dai tueng ting la SLen1, SLen?. - Thuat toan: 1/ Kim tra tinh hgp 1é cla SLen1 va SLen2: SLen1 + SLen2 = Length B1: IF (SLen1 > Length) B11: SLenl = Length B1.2: SLen2 = 0 B2: IF (SLen2 > Length) B2.1: SLen2 = Length B2.2: SLenl = 0 B3: IF (SLen! + Slen2 + Length) SLen2 = Length - SLen1 B4: IF (SLen1 < 0) SLen1 = 0 BS: IF (SLen2 < 0) SLen2 = 0 Trang: 88 Guia tink: Cite Puie Dic Litu va Gidt Thue // Chép SLen1 phan tir dau trong M vao SMI B6:i=1,si=1 B7: IF (i > SLen1) Thye hign B11 BB: SMI[si] = Mi] B9: itt, sit+ B10: Lap lai B7 // Chép SLen2 phan tls cuéi trong M vao SM2 BIL: si=1 B12: IF (i > Length) Thue hign Bkt B13: SM2{si] = M{i] B14: iss, sir B15: Lap lai B12 Bkt: Két thac - Cai dt thugt toan: Ham CD_Split c6 prototype: void CD_Split(T MII, int Len, T SMI[J, int &SLen1,T SM2[], int &SLen2); Ham thy hién vige sao chép néi dung SLen1 phan tif dau tién trong danh séch M vao trong danh con SMI va sao chép SLen2 phan ti cudi cing trong danh sch M vao trong danh séch con SM2, Ham higu chinh lai SLen1, SLen2 néu cdn thiét. Noi dung cia ham nhu sau: void CD_Split(T Ml], int Len, T SMI[], int &SLen1,T SM2J], int &SLen2) { if (SLent >= Len) { SLen! = Len; SLen2 = 0; } if (SLen2 > { SLen2 SLenl = } if (SLenl <0) SLeni if (SLen2 <0) SLen2 = 0; if (SLen1 + SLen2 != Len) SLen2 = Len - SLen1; for (int i = 0; i < SLenl; i++) SMI[i] = Mi]; for (int j = 0; i < Len; irs, jo+) SM2{j] = Mfi]: return; , i. Nhép nhiéu danh séch thanh mé6t danh séch: Tay thudc vio ting yéu cau cu thé ma vige nhap nhiéu danh sach thanh mét danh. ‘sach cé thé thyc hién theo céc phudng phép khac nhau, co thé la: ng: B2 Guia tink: Cite Puie Dic Litu va Gidt Thue + Ghép néi duéi cdc danh sach lai véi nhau; + Tron xen lén céc phan ty trong danh sach con vao danh séch Ién theo mét trat ty nhat dinh nhu ching ta da trinh bay trong céc thuat todn tron 6 Chucng 3. G day chung ta tinh bay céch ghép céc danh séch thanh mét danh séch. Gia sit ching ta cn ghép cdc danh séch SMI, SM2 cé chiéu dai SLen1, SLen2 vao thanh mét danh sch M cé chigu dai Length = SLen1 + SLen2 theo thif ty tu SM1 rdi én SM2. - Thuat toan: // Kiém tra khé nang chita ca M: SLen1 + SLen2 < MaxLen BI: IF (SLen] + SLen2 > MaxLen) Thye hign Bkt 1 Chép SLen1 phan ti dau trong SMI vao déu M B2:i=1 B3: IF (i > SLen1) Thue hién B7 Ba: Mii] = SMI] BS: ins B6: Lap lai B3 // Chép SLen2 phan ti dau trong SM2 vao sau M B7: si BB: IF (si > SLen2) Thyc hién Bkt B9: Mii] = M2[si] B10: i++, sit+ B11: Lap Iai BB Bkt: Két thie - Cai dgt thuat toan: Ham CD_Coneat cé prototype: int CD_Concat (T SM1[], int SLeni, T SM2[], int SLen2,T M[], int &Len); Ham thye hign viée sao ghép néi dung hai danh séch SM1, SM2 cé chiéu dai tuong ting SLen1, SLen2 vé danh séch M cé chiéu dai Len = SLen1 + SLen2 theo thif ty’ SMI dén SM2. Ham tra vé chiéu dai ca danh séch M sau khi ghép néu vig ghép thanh cong, trong trudng hep nguge lai ham tr vé gié tri -1. Noi dung cia ham nhu sau: int CD_Concat (T SMI[J, int SLen1, T SM2[], int SLen2, T Ml], int &Len) { if (SLen1 + SLen2 > MaxLen) return (-1); for (int i = 0; 1 < SLent; i++) MU] = SMI[i]; for (int j = 0; j « SLen2; i++, j++) Mf = SM2Ij; Len = SLeni + SLen2; ng: 20 Guia tink: Cite Puie Dic Litu va Gidt Thue return (Len); Q J. Sao chép mét danh sch: Gia sit ching ta can sao chép ndi dung dach sach M cé chiéu dai Length vao thanh danh séch CM cé cling chiéu dai. - Thuat toan: Bli=1 B2: IF (i > Length) Thyc hign Bkt B3: CM[i] = M{i] BA: itt BS: Lap lai B2 Bkt: Két thac - Cai dat thugt toan: Ham CD_Copy c6 prototype: int CD_Copy (T Mf], int Len, T CM{)); Ham thuc hién vie sao chép néi dung danh séch M cé chiéu dai Len vé danh sach CM 6 cling chiéu dai. Ham tra vé chiéu dai cia danh séch CM sau khi sao chép. Noi dung cia ham nhu sau: int CD_Copy (T MJ, int Len, T CM{}) { for (int i = 0; i < Len; i++) Cot] = Mil return (Len); } k. Hily danh séch: Trong thao tac nay, néu danh sach duge cép phat déng thi ching ta tién hanh hiy ba (x6a ba) toan b6 céc phan tif trong danh sch bang toan tit hy bé (trong C/C++ la free/delete). Néu danh sch duge cp phat tinh thi viéc hy bé chi la tam théi cho chiéu dai ca danh sach vé 0 cén vigc thu héi bd nhé sé do ngon ngit ty thc hien. 4.3.4. Uu nhuge diém va Ung dung a. Un nhutge diém: Do cae phan tur duge luu tri lien tiép nhau trong bé nhé, do vay danh sch dac 6 ac uu nhuge diém sau day: - Mat d6 str dung b6 nhé cia danh sch dac la tdi uu tuyét di (100%); - Vig truy xuét va tim kiém cdc phan ttf ca danh séch dac la dé dang vi céc phan tif diing lién nhau nén chung ta chi can st dyng chi sé dé dinh vi vi tri céc phan td trong danh séch (dinh vi dia chi céc phan tit); - Vige them, bét cac phan tif trong danh séch dac c6 nhiéu khé khan do chting ta phai di dai céc phan tit khac di qua ché khéc. Trang: 21 Guia trink: Cite Tuie Dit Lipa vd Gidd Thudt b. Ung dung cita danh sch dac: Danh sach dac dude ting dung nhiéu trong céc cau trac dif ligu mang: mang | chiéu, mang nhiéu chiéu; Mang cp phat tinh, mang cép phat dong; .. ma chung ta da nghién ctfu va thao tac kha nhiéu trong qua trinh lap trinh trén nhiéu ngén ngit lap trinh khac nhau. 4.4, Danh sach lién két (Linked List) 4.4.1, Dinh nghia Danh sach lign két 1a tap hgp céc phan ttr ma gitfa ching cd mot sy néi két vai nhau thong qua ving lién két cia ching. Su néi két gitfa céc phan tit trong danh séch lién két dé la suf quan ly, rang bude Kin nhau vé néi dung cua phan tif nay va dja chi dinh vj phan tir kia. Tay thudc vao mic 46 va cach thife néi két ma danh sach lien két ¢6 thé chia ra nhiéu loai khéc nhau: - Danh sch lién két dan; - Danh sach lin két doi/kép; - Danh sch da lién két; Danh sach lién két vong (véng dén, véng déi). Méi loai danh séch sé cé cach biéu dién céc phan ti (cdu tric dif ligu) riéng va cde thao tac trén 46, Trong tai liu nay chiing ta chi trinh bay 02 loai danh sach lién két co ban la danh sch lién két dén va danh séch lién két d6i 4.4.2, Danh sch lién két don (Singly Linked List) A. Céu trac dif ligu: Noi dung cia méi phan tif trong danh sach lién két (cén goi la mét nut) gdm hai ving: Ving dir ligu va Ving lien két va cé edu tric dir lieu nhu sau: typedef struct SLL_Node { T Key; InfoType Info; SLL_Node * NextNode; // Ving lién két quan ly dia chi phan tl ké tiép } SLL_OneNode; Tung ty nhuf trong cée chung tude, & day dé din gidn ching ta cing gid thiét rang ving dif liu cua méi phan tit trong danh sach lién két don chi bao gém mét thanh phan khéa nhén dign (Key) cho phan tif d6. Khi dé, cu tric dif ligu trén 6 thé viét lai don gién nhu’ sau typedef struct SLL_Node { T Key; SLL_Node * NextNode; // Ving lién két quan ly dia chi phan tu ké tiép } SLL_OneNode; typedef SLL_OneNode * SLL_Type; Trang: 22 Guia tink: Cite Puie Dic Litu ua Gud Thue Dé quan ly mot danh séch lién két ching ta 6 thé sir dung nhiéu phusng phap khac nhau va tuong Ung vdi cae phutong phap nay ching ta sé cé cdc edu tric di ligu khae nhau, ey thé + Quén Iy dja chi phin tt déu danh sach: SLL_Type SLListl; Hinh anh minh hoa: SLListl NQLL e115 |e} io |e} 20/e}) 18 |e} > 40 |e} >| 35 |e} > 30 jet > - Quén Iy dja chi phin ti déu va cuéi danh séch: typedef struct SLL_PairNode ( SLLType SLLFirst; SLL_Type SLLLast; ) SLLP_Type; SLLP_Type SLList2; Hinh anh minh hoa: SLLFirst hpLast NOLL fis Aft AL 20 ff ae AY a0 [HY 5 [FAY 30 [A - Quan Iy dja chi phén ti déu, dia chi phan tit cubi va s6 phan ti trong danh séch: typedef struct SLL_PairNNode { SLL_Type SLLFirst; SLL_Type SLLLast; unsigned NumNode; ) SLLPN_Type: SLLPN_Type SLList3; Hinh anh minh hoa: SLLFirst Shplast_ NULL e115 |epPiio 20 #1 18 |@¢>| 40 |@+-4, 35 [#4] 30 |ey> + nummNode - 7 B, Cac thao tac trén danh sach lién két don: Véi méi cach quan ly khac nhau cla danh sach lién két don , cc thao téc cing sé 6 sy khc nhau vé mat chi tiét song ngi dung c¢ ban it c6 sy khac nhau. Do vay, & day ching ta chi trinh bay cac thao tac theo cach quan ly thi nhat (quan ly dia chi ca phan ti du danh sach lien két don), céc céch quan ly khac sinh vien ty van dung dé diéu chinh cho thich gp. Trang: 23 Guia tink: Cite Puie Dic Litu va Gidt Thue a, Khdi tao danh sdch (Initialize): Trong thao téc nay chi dan gian la chung ta cho gia tri con tré quan ly dia chi phan ti dau danh sach vé con tré NULL. Ham khdi tao danh sch lién két don nhu sau: void SLL_Initialize(SLL_Type &First) ( First = NULL; return; } Hinh anh minh hoa: SLListl NaLL . > b. Tao méi mét phan tit / nit: Gia si chting ta can tao mdi mét phan tiv cé thanh phan dif ligu 1a NewData. - Thuat toan: B1: First = new SLL_OneNode B2: IF (First = NULL) Thue hign Bkt B3: First-»NextNode = NULL B4: First->Key = NewData Bkt: Két thic = Cai dat thugt toan: Ham SLL_Create_Node c6 prototype: SLL_Type SLL_Create_Node(T NewData); Ham tao méi mét nut cé thanh phan dif ligu la NewData, ham tra vé con tré trd tdi dia chi cia nuit mdi tao. Néu khong du b6 nhé dé tao, ham tra vé con trd NULL. SLL_Type SLL_Create_Node(T NewData) { SLL_Type Pnode = new SLL_OneNode; if (Pnode != NULL) { Pnode->NextNode = NULL; Pnode->Key = NewData; } return (Pnode); ) - Minh hea thuat toan: Gia sit chiing ta cén tgo nuit e6 thanh phan dir ligu la 20: NewData = 20 Pnode = new SLL_OneNode Pnode @— H+ Pnode->NextNode = NULL Pnode->Key = NewData Trang: 24 Guia tink: Cite Pie Dic Litu va Gidt Thue Pnode ¢ {20 Je} NULL c. Thém mét phan fit vao trong danh sdch: Gid str ching ta cdn them mét phn tir c6 gia tr] thanh phan dif ligu la NewData vao trong danh sach. Vigc thém c6 thé dién ra 6 dau, cudi hay 6 gitfa danh séch lién két. Do vay, 6 day ching ta trinh bay 3 thao tac thém riéng biét nhau: - Thu@t toan thém phan tif vo déu danh sch lién két don: Bl: NewNode = SLL_Create_Node (NewData) B2: IF (NewNode = NULL) Thuc hien Bkt B3: NewNode->NextNode = SLList // Néi SLList vao sau NewNode B4: SLList = NewNode _// Chuyén vai tré ding dau cla NewNode cho SLList Bkt: Két thac = Minh hoa th t toan: Gia sir chiing ta can them iit ¢6 thanh phan dif ligu la 25: NewData = 25 NewNode fas |e} > nai NQLL SLList *—/10 [#4 20/97) 18 [e+] 40 [et 35 [#7 30 [ey > NewNode->NextNode = SLList: NewNode {25 |e} SLList 10 |e 40 |} + SLList = NewNode: NewNode elas suite Nau 18 ao |} + Kt qua sau khi chen: SLList NLL e125 [eto [e}_20 18 40 |e} y+ - Thu@t ton thém phan tif vao cudi danh séch lign két don: B1: NewNode = SLL_Create_Node (NewData) B2: IF (NewNode = NULL) © Guia tink: Cite Puie Dic Litu va Gidt Thue Thyc hign Bkt B3: IF (SLList = NULL) 3.1: SLList = NewNode B3.2: Thye hién Bkt Ji Tim dén dia chi cua phan tif cudi cling trong danh sch lign két don Ba: CurNode = SLList B5: IF (CurNode->NextNode = NULL) Thyc hign BB B6: CurNode = CurNode->NextNode —_// Chun qua nut ké tiép B7: Lap lai BS BB: CurNode->NextNode = NewNode _// Ndi NewNode vao sau CurNode Bkt: Két thac - Minh hoa thu@t toan: Gia sif chiing ta cn thém nut c6 thanh phan dif ligu la 25: NewData = 25, NOLL NewNode *—* 25 |@]> SLList Curgjode fas fio FAL 20 [HL a8 PL 40 [FH 35 [> nate CurNode-sNextNode = NewNode: NOLL NewNode 25 |ey? SLList Curkiode 15 [ep ofio [et o[ 20]e}[ 18 [2] 40 [2] 35 [#F Két qua sau khi chen: SLList NULL ois [toi [4] 20 18 40 [> j> - Thu@t ton thém phan tif vao gida danh séch lign két don: Gia sit ching ta cén them mt phan tw cé gid tr thanh phan dir ligu la NewData vao trong danh sach SLList vao ngay sau nit cé dia chi InsNode. Trong thyc té nhiéu khi chung ta phai thye hign thao tac tim kiém dé xac dinh dia chi InsNode, & day gia st chung ta da xac dinh duge dia chi nay. B1: NewNode = SLL_Create_Node (NewData) B2: IF (NewNode = NULL) Thue hién Bkt B3: IF (InsNode->NextNode = NULL) B3.1: InsNode->NextNode = NewNode B3.2: Thye hién Bkt Trang: 2 Guia tink: Cite Puie Dic Litu va Gidt Thue SLList InsYode InsNode->NextNode SLList Kt qua sau khi chen: //N6i cac nut ké sau InsNode vao sau NewNode B4; NewNode->NextNode = InsNode->NextNode // Chuyén méi lign két gidfa InsNode vdi nut ké cia né vé NewNode B5: InsNode->NextNode = NewNode Bkt: Két thac - Minh hoa thuat toan: Gia sif chang ta cén thém nuit ¢6 thanh phan dif ligu la 25 vo sau nut c6 dia chi InsNode nhu sau: NewData = 25 NewNode #25 |@]— NULL fis R10 AL 20 [ef as [A 40 [A 35 [A nae NewNode->NextNode = InsNpde-»NextNode: el NewNode *— SLList Insode +7 35 |} NaLL NewNo« e+ 35 |e} NOLL InsNode SLList NaLL aL eis |eptio |e 13 |@y> = Cai dt thugt toan: Cac ham thém phan tif tudng ting véi céc truéng hdp c6 prototype nhu sau: SLL_Type SLL_Add_First(SLL_Type &SList, T NewData); SLL_Type SLL_Add_Last(SLL_Type &SList, T NewData); SLL_Type SLL_Add_Mid(SLL_Type &SList, T NewData, SLL_Type &InsNode); Ham thy hign vic chén phan ti cé gid tri thanh phan dif ligu NewData vao trong danh sach lién két don quan ly bdi con tré déu danh séch SList tudng ding vi 3 truéng hgp: Thém dau, them cu6i, thém gia, Cac ham tra vé gié tri la dja chi cua nit dau tién néu viée thém thanh céng. Trong truéng hgp nguge lal, cae ham tra vé con tré NULL. Rigng déi véi truéng hgp thém giifa, ham SLL_Add_Mid thye hién vige them vao gay sau nat ¢6 dja chi InsNode. Noi dung cua céc ham nhu sau: Trang: 97 Guia tink: Cite Puie Dic Litu va Gidt Thue SLL_Type SLL_Add First(SLL_Type &SList, T NewData) { SLL_Type NewNode = SLL_Create_Node(NewData); if (NewNode == NULL) return (NULL); NewNode->NextNode = SList; SList = NewNode; return (SList); ) Wt SLL_Type SLL_Add_Last(SLL_Type &SList, T NewData) { SLL_Type NewNode = SLL_Create_Node(NewData); if (NewNode == NULL) return (NULL); if (SList == NLL) { SList = NewNode; return (SList); } SLL_Type CurNode = SList; while (CurNode->NextNode != NULL) CurNode = CurNode-»NextNode; CurNode->NextNode = NewNode; SLL_Type SLL_Add_Mid(SLL_Type &SList, T NewData, SLL_Type &lnsNode) { SLL_Type NewNode = SLL_Create_Node(NewData); if (NewNode == NULL) return (NULL); if (InsNode->NextNode == NULL) { InsNode->NextNode = NewNode; return (SList); } NewNode->NextNode = InsNode->NextNode; InsNode->NextNode = NewNode; return (SList); y d. Duy@t qua cdc mit trong danh sich: Day ld mét thao téc thung xuyén xay ra trén danh séch lién két dén néi chung va ac danh sach khéc néi riéng dé thuc hign thao tac xi ly cae niit hoac xu ly dif ligu tai cae miit. Cé nhigu thao tac xif ly toy tling truBng hep va yéu cau song d day don gian ching ta chi duyet dé xem néi dung thanh phan dif ligu trong danh séch. - Thuat toan: B1: CurNode = SLList B2: IF (CurNode = NULL) Thye hign Bkt ng: 28 Guia tink: Cite Puie Dic Litu va Gidt Thue B3: OutputData(CurNode->Key) —_// Xuat gié tr thanh phan dir Ba: CurNode = CurNode->NextNode B5: Lap lai B2 Bkt: Két thac u trong 1 nt - Cai dt thugt toan: Ham SLL_Travelling ¢6 prototype: void SLL_Travelling(SLL_Type SList); Ham duyét qua cée mit trong danh séch lién két dén quan ly béi dja chi nut déu tien théng qua SList dé xem n@i dung thanh phan dif ligu cua mdi nit. N6i dung cia ham nhu sau: void SLL_Travelling (SLL_Type SList) { SLL_Type CurNode = SList; while (CurNode != NULL) { OutputData(CurNode->Key); CurNode = CurNode->NextNode; } return; = Luu yg: Ham OutputData thuc hign viée xudt ndi dung cia mét bién cé kiéu dif ligu T. Tay vao tUing trudng h¢p cy thé ma ching ta viét ham OutputData cho phi hgp. ¢. Tim kiém mét phéin tit trong danh sch: Gia str chung ta can tim kiém xem trong danh sach lién két don c6 tdn tai nut ¢6 thanh phan dif ligu la SearchData hay khong. Thao téc nay chting ta van dung thuat toan tim tuyén tinh dé tim kiém, = Thust ton: B1: CurNode = SLList B2: IF (CurNode = NULL OR CurNode->Key = SearchData) Thye hign Bkt B3: CurNode = CurNode->NextNode B4: Lap lai B2 Bkt: Két thic - Cai dat thugt toan: Ham SLL_ Searching cé prototyp SLL_Type SLL_Searching(SLL_Type SList, T SearchData); Ham thye hign viée tim kiém nut ¢6 thanh phan dif ligu la SearchData tren danh sch lign két don quan ly bdi dja chi niit du tién thong qua SList. Ham tra vé dia chi cda nit dau tién trong danh séch khi tim thay, nguge lai ham tra vé con td NULL. Noi dung cia ham nhu sau: Trang: 92 Guia tink: Cite Puie Dic Litu va Gidt Thue SLL_Type SLL Searching(SLL_Type SList, T SearchData) { SLL_Type CurNode = SList; while (CurNode != NULL) {if (CurNode->Key == SearchData) break; CurNode = CurNode->NextNode; } return (CurNode); ) f. Logi bd bot mot phan tit ra khéi danh sch: Gia str ching ta cn loai bé phan tif cé gid tri thanh phn dif liéu la DelData trong dan sach lien két don. Dé thyc hign diéu nay trude tien ching ta phai thyc hign thao tac tim kiém dia chi cia nut cé thanh phan dif ligu la DelData, sau dé méi thye hign thao téc loai bé néu tim thay. Tuy nhién trong qué trinh tim kiém, néu tim thay ching ta phai ghi nhan dja chi cla nat dting ngay trudc nut tim thay la PreDelNode. + Thuat toai // Tin kiém nat c6 Key la DelData trong danh sch B1: DelNode = SLList B2: PreDelNode = NULL B3: IF (DelNode = NULL) Thy hign Bkt B4: IF (DelNode->Key=DelData) Thy hién BB B5: PreDelNode = DelNode B6: DelNode = DelNode->NextNode B7: Lap lai B3 // Logi bé nut tai dja chi DelNode ra khdi danh sach B8: IF (PreDelNode = NULL) J/ Loai bé nit dau tién trong danh séch B8.1: SLList = SLList->NextNode B8.2: Thyc hién B10 j/ Lién két cac nét sau DelNode vé nut PreDelNode B9: PreDelNode->NextNode = DelNode->NextNode 1/ Cat méi lién két gitta DelNode véi cc niit cén lai trong danh sch // va hy DelNode B10: DelNode->NextNode = NULL B11: delete DelNode Bkt: Két thac - Cai dt thugt toan: Ham SLL_Delete_Node cé prototype: int SLL_Delete_Node (SLL_Type &SList, T DelData); Guia tink: Cite Puie Dic Litu va Gidt Thue Ham thyc hién viée xéa phan ti cé thanh phan dif ligu la DelData trong danh séch lien két quan ly béi con tré dau SList. Ham tr vé gié tri 1 néu vie x6a thanh céng va nguge lai, ham tra vé gié tri -1. Néi dung cia ham nhu sau int SLL_Delete_Node (SLL_Type &SList, T DelData) { SLL_Type DelNode = SList; SLL_Type PreDelNode = NULL; while (DelNode != NULL) { if (DelNode->Key == DelData) break; PreDelNode = DelNode; DelNode = DelNode->NextNode; } if (DelNode == NULL) return (-1); if (PreDelNode == NULL) SList = SList->NextNode; else PreDelNode->NextNode = DelNode->NextNode; DelNode->NextNode = NULL; delete DelNode; return (1); ) - Minh hoa thuat toan: + Gia si ching ta cn hay nit c6 thanh phan dif ligu la 25: DelData = 25 SLList NQLL e925 |eptio [ey] 20/97) 18 |e} 40 [#77 35 [#77 30 |e DelNot SLList = SLList->NextNode Deng SLLI DelNode->NextNode = NULL ae NLL 25 DelNoge SLList NQLL Két qua sau khi hay: SLList 20/9} 18 |} 40 /¢+-4 35 [e+-4 30 fey > Ae CECE RIC EEIGR ESIC REnIGen Trang: 101 Guia tink: Cite Puie Dic Litu va Gidt Thue + Bay gié gid siz ching ta cn hay mut c6 thanh phan dif ligu la 20: DelData = 20 SLList DelNode @ NOLL 125 |e} a10 |e 40 |e} + PreDelNod PreDelNode->NextNode = DelNode->Next SLList DelNode @ NQLL 125 |epajio | 140 [9 3 PreDelNod DelNode->Next = NULL SLList DelNode @ NOLL. NOLL e125 |eta10 | ao [eb a PreDelNod Két qué sau khi hiy: SLList 125 |e [10 fe ©P>| 30 [ey NaLL g. Hy danh sécl Thao tac nay thyc chét la thc hién nhiéu lan thao tac huy mét ntit, - Thuat toan: B1: IF (SLList = NULL) Thue hign Bkt B2: TempNode = SLList B3: SLList = SLList->NextNode Bd: TempNode->NextNode = NULL B5: delete TempNode B6: Lap lai BI Bkt: Két thac - Cai dat: Ham SLL_Delete cé prototype: void SLL_Delete (SLL_Type &SList); Ham thy hign viéc hy toan bé danh séch SList. Néi dung cia ham nhu sau: void SLL_Delete (SLL_Type &SList) { SLLType TempNode = SList; while (SList != NULL) {. SList = SList->NextNode; ‘TempNode->NextNode = NULL; Trang: 102 Guia tink: Cite Puie Dic Litu va Gidt Thue delete TempNode; ‘TempNode = SList; } return ; } h. Tao méi danh séch/ Nhép danh sach: Viec tao moi mét danh séch lien két don thyc chat la ching ta lién tye thyc hién thao tac them mat phan tu vao danh séch ma ban déu danh séch nay la mot danh séch réng. Cé thé sif dung mét trong ba ham thém phan ti dé thém phan tif, day ching ta sit dyng ham SLL_Add First Gia sit ching ta cdn tao danh sch lién két dén cé N phan tit = Thuat toan: B1: SLL_Initialize(SLList) B2:i=1 B3: IF (i > N) Thyc hign Bt B4: NewData = InputNewData() J Nhép gié tri cho bign NewData B5: SLL_Add_First(SLList, NewData) BO: i++ B7: Lap lai B3 Bkt: Két thic - Cai dat thugt toan: Ham SLL_Create c6 prototype: SLL_Type SLL_Create(SLL_Type &SList, int N); Ham tao danh sach lién két don cé N nut quan ly béi dja chi nut dau tién thong qua SList. Ham tra vé dja chi cla nut dau tién trong danh sch néu vige tao thanh céng, ngu¢e lai ham tra vé con trd NULL. Noi dung ca ham nhu sau: SLL_Type SLL_Create(SLL_Type &SList, int N) { SLL_Initialize(SList); T NewData; for (int i= 0; i < N; i++) { NewData = InputNewData(); if (SLL_Add_First(SList, NewData) == NULL) { SLL_Delete (SList); break; , } return (SList); Trang: 103 Guia tink: Cite Puie Dic Litu va Gidt Thue Ham InputNewData thy hién vie nhap vao néi dung cia mét bin cé kiéu dif ligu T va tra vé gid tri méi nh@p vao. Tuy vao tung trugng hgp cy thé ma chung ta viét ham InputNewData cho pha hgp. i. Téch mé6t danh séch thanh nhiéu danh séch: Tung ty nhut danh sach dc, viée tach mét danh séch lién két don thanh nhigu danh séch lién két don khéc nhau cing cé nhiéu tiéu thie khac nhau ma chting ta sé thye hign theo céc céch khdc nhau. Ngoai ra vigc tach cing sé khéc nhau trong truéng hgp ¢6 hay kh6ng gid Iai danh séch ban dau. O day ching ta thye hién viée tach cde nit trong danh sach lién két ddn SLList thanh hai danh sach lién két don con SLList va SLList! luan phién theo cdc dudng chay ty nhién va khéng giif lai danh sch lién két ban dau. Céc trudng hgp khéc sinh vien ty van dung 4€ thao tac. - Thuat toan: B1: CurNode = SLList B2: SLList] = SLList B3; LastNodel = NULL, LastNode2 = NULL JI Cat cc nut tit sau dung chay ty nhién thif nhét vé SLList! B4: IF (CurNode = NULL OR CurNode->NextNode = NULL) Thue hign Bkt B5: IF (CurNode->Key > CurNode->NextNode->Key) B5.1: LastNodel = CurNode 5,2: SLList] = SLList1->NextNode B5.3: CurNode = CurNode->NextNiode B5.4: LastNodel->NextNode = NULL B5.5: Thy hign BB B6: CurNode = CurNode->NextNode, SLList! = SLListl->NextNode B7: Lap lai B4 1/ Cat cac nut ty sau dung chay ty nhién thit hai vé SLList BB: IF (CurNode = NULL OR CurNode->NextNode = NULL) Thyc hign Bkt B9: IF (CurNode->Key > CurNode->NextNode->Key) 9.1: LastNode2 = CurNode B9.2: CurNode = CurNode->NextNode 9,3: LastNode2->NextNode = NULL B9.4: Thye hign B12 B10: CurNode = CurNode->NextNode B11: Lap lai B8 1/ Phan phéi (git! lai) dung chay ké tiép trong SLList B12: LastNodel->NextNode = CurNode B13: IF (CurNode = NULL OR CurNode->NextNode = NULL) Thye hién Bkt B14: IF (CurNode->Key » CurNode-»NextNode->Key) B14.1: LastNodel = CurNode B14.2: CurNode = CurNode->NextNode Trang: 104 Guia tink: Cite Puie Dic Litu va Gidt Thue 14.3: LastNodel->NextNode = NULL B14.4: Thye hign B17 B15: CurNode = CurNode->NextNode B16: Lap lai B13 1 Phan phéi (git Iai) dung chay ké tiép trong SLList] B17: LastNode2->NextNode = CurNode B18: IF (CurNode = NULL OR CurNode->NextNode = NULL) Thue hign Bt B19: IF (CurNode->Key > CurNode->NextNode->Key) B19.1: LastNode2 = CurNode B19.2: CurNode = CurNode->NextNode B19.3: LastNode2->NextNode = NULL B19.4; Lap lai B12 B20: CurNode = CurNode->NextNode B21: Lap lai BIS Bkt: Két thac - Cai dat thuat toan: Ham SLL. Split c6 prototype: SLL_Type SLL_Split(SLL_Type &SList, SLL_Type &SList!); Ham thyc hién vige phan phéi bét céc duéng chay ty nhién trong SList sang SList1. Ham tra vé con tré tré tdi dia chi phan tif dau tién trong SList] Noi dung cia ham nhuf sau: SLL_Type SLL_Split(SLL Type &SList, SLL Type &SList!) { SList] = SList; if (SList] -- NULL) return (NULL); SLL_Type Lastl; SLL_Type Last2; while (SListl->NextNode != NULL) { if (SListl->Key » SList]-»NextNode->Key) break; SList] List -> NextNode; 4 if (SList1->NextNode != NULL) Last = SList!; SList1 = SList1->NextNode; Last1->NextNode = NULL; SLL_Type CurNode = SListl; if (CurNode == NULL) return (NULL); while (CurNode->NextNode != NULL) {if (CurNode->Key > CurNode->NextNode->Key) break; CurNode = CurNode->NextNode; Trang: 105 Guia tink: Cite Puie Dic Litu va Gidt Thue } if (CurNode->NextNod: return (SList!); Last2 = CurNode; CurNode = CurNode->NextNode; Last2->NextNode = NULL; while (CurNode != NULL) { Lastl->NextNode = CurNode; if (CurNode->NextNode == NULL) break; while (CurNode->NextNode != NULL) (if (CurNode->Key > CurNode-»NextNode->Key) break; Cur Node = CurNode->NextNode; b if (CurNode->NextNode break; Last] = CurNode; CurNode = CurNode->NextNode; Last]->NextNode = NULL; Last2->NextNode = CurNode; if (CurNode->NextNode == NULL) break; while (CurNode->NextNode != NULL) { if (CurNode->Key > CurNode->NextNode->Key) break; Cur Node = CurNode->NextNode; } if (CurNode->NextNode =: break; Last2 = CurNode; CurNode = CurNode->NextNode; Last2->NextNode = NULL; NULL) NULL) NULL) 3 return (SList1); ) j. Nh@p nhiéu danh sdch thanh mét danh séch: Tuong ty, viée nh@p nhiéu danh sach thanh mét danh sach ching ta thyc hién theo hai truéng hgp khac nhau: + Ghép néi dudi cdc danh séch lai véi nhau; + Tron xen lan cde phan tif trong danh sach con vao thanh mét danh sach lén theo mét trat ty nhat dinh, Ngoai ra viée nhap cé thé gill lai céc danh sach con ban dau hoac khéng git lai cae danh sach con ban dau. 6 day ching ta trinh bay theo cach kh6ng gilt lai cée danh séch con ban dau va trinh bay theo hai truéng hop: + Ghép néi dudi hai danh séch lai véi nhau; a Tran 8 Guia tink: Cite Puie Dic Litu va Gidt Thue + Trén hai danh sach lai véi nhau theo cae duéng chay ty nhién thanh mét danh sch ¢6 chiéu dai Ién hen. Gia sit ching ta cdn nhap hai danh sch SLList1, SLList2 lai véi nhau. - Thu@t ton ghép danh sach SLList2 vao sau SLListl: B1: IF (SLListl = NULL) B1.1: SLListl = SLList2 B1.2: Thyc hign Bkt 2; IF (SLList2 = NULL) Thy hign Bt 1 Lay dia chi nit cusi cing trong SLList1 B3: LastNode = SLList! B4: IF (LastNode->NextNode = NULL) Thy hi¢n B7 BS: LastNode = LastNode->NextNode B6: Lap lai Ba J Ghép SLList2 vao sau LastNode B7: LastNode-»NextNode = SLList2 Bkt: Két thc - Thu@t ton trn danh sach SLList2 va SLList1 thanh SLList theo céc dugng chay ty nhién: B1: IF (SLList1 = NULL) B1.1: SLList = SLList2 B1.2: Thyc hign Bkt B2: IF (SLList2 = NULL) B2.1: SLList = SLList] B2.2: Thye hién Bkt J/ Lay nit ©6 dif ligu nhé hen trong 2 nut dau cla 2 danh séch dua vé SLList B3: IF (SLList1->Key < SLList2->Key) B3.1: TempNode = SLList! 3.2: SLList] = SLList1->NextNode Bd: ELSE B4.1: TempNode = SLList2 4.2: SLList2 = SLList2->NextNode BS: TempNode->NextNode = NULL B6: IF (SLList1 = NULL) B6.1: TempNode->NextNode = SLList2 6.2: Thye hién Bkt B7: IF (SLList2 = NULL) 7.1: TempNode->NextNode = SLList1 B7.2: Thy hign Bkt B8: IF (SLList1->Key < SLList2->Key) AND (TempNode->Key < SLList]->Key) BB.1: MinNode = SLList] B8.2: SLList] = SLList1->NextNode Trang: 107 Guia tink: Cite Puie Dic Litu va Gidt Thue B9: ELSE 9.1: MinNode = SLList2 9.2: SLList2 = SLList2->NextNode B10: TempNode->NextNode = MinNode B11: MinNode->NextNode = NULL B12: TempNode = MinNode B13: Lap lai B6 Bkt: Két thac = Cai dat: Cac ham nh§p danh sach cé prototype: SLL_Type SLL_Concat (SLL_Type &SList!, SLL_Type &SList2); SLL_Type SLL_Merge(SLL_Type &SList1, SLL Type &SList2, SLL_Type &SList); Ham thyc hign vige nhp cae nit trong hai danh sach SListl, SList2 thanh mot danh sach theo thi ty nhu hai thuat toan via trinh bay. Ham tra vé dia chi cia nut dau cua danh séch sau khi ghép. Noi dung cia cae ham nhu sau: SLL_Type SLL_Concat (SLL_Type &SListl, SLL_Type &SList2) {if (SListl == NULL) { SList] = SList2; return (SList1); } if (SList2 == NULL) return (SList1); SLL_Type LastNode = SListl; while (LastNode->NextNode != NULL) LastNode = LastNode->NextNode; List2; LastNode->NextNode return (SList1); ) SLL_Type SLL_Merge (SLL_Type &SList!, SLL_Type &SList2, SLL_Type &SList) {if (SList1 == NULL) { SList = SList2; return (SList); } if (SList2 == NULL) { SList = SList1; return (SList } SLL_Type LastNode = NULL; SLL_Type Temptode; while (SListl != NULL && SList2 != NULL) { if (SListI->Key <= SList2->Key) { TempNode = SList!; SListl = SListl->NextNode; Guia tink: Cite Puie Dic Litu va Gidt Thue TempNode->NextNode = NULL; if (LastNode == NULL) SList = LastNode = TempNode; else { LastNode->NextNode = TempNode; LastNode = TempNode; } if (SList == NULL) break; if (SList1->Key < LastNode->Key) while (SList2 != NULL) { LastNode->Next = SList2; LastNode = LastNode->NextNode; SList2 = SList2->NextNode; LastNode->NextNode = NULL; if (SList2 == NULL II SList2->Key < LastNode->Key) break; else { TempNode = SList2; SList2 = SList2->NextNode; TempNode->NextNode = NULL; if (LastNode == NULL) SList = LastNode = TempNode; else { LastNode->NextNode = TempNode; LastNode = TempNode; 3 if (SList2 == NULL) break; if (SList2->Key < LastNode->Key) while (SList1 != NULL) { LastNode->Next = SListl; LastNode = LastNode->NextNode; SListl = SListl->NextNode; LastNode->NextNode = NULL; if (SList] == NULL II SListl->Key < LastNode->Key) break; } } if (SList] == NULL) LastNode->NextNode = SList2; else LastNode->NextNode = SList1; return (SList); Trang: 102 Guia trink: Cite Tuie Dit Lipa vd Gidd Thudt k, Sdp xép thit ty cde phan tit trong danh séch: Thao téc nay chiing ta cé thé van dung céc thuat ton sép xép da trinh bay trong Chugng 3 dé sép xép dif liu trong danh sach lién két den. O day ching ta chi trinh bay sy van dung thuat toan tron ty nhién dé sap xép. Cung can uu y rng déi véi thao tac hoan vi hai phan ti thi ching ta c6 thé hoan vi hoan toan hai nut hoe chi hoan vi phn dif ligu. Tuy nhién vi¢c hodn vi hoan toan hai nut sé phiic tap han, - Thuat toan sp xép trén ty nhién: B1: IF (SLL_Split(SLList, TempList) = NULL) Thye hign Bkt B2: SLL_Merge(SLList, TempList, SLList) B3: Lap lai BI Bkt: Két thac = Cai Ham SLL_Natural Merge Sort ¢6 prototype: void SLL_Natural_Merge Sort (SLL_Type &SList); Ham thy hién viée sép xép thanh phan dif ligu cia cdc nut trong danh séch SList theo thif ty tang dya trén thuat todn tron ty nhién vita trinh bay. Noi dung cia ham nhu sau: void SLL_Natural_Merge Sort (SLL_Type &SList) ( SLLType TempList = NULL, List = NULL; while (SLL_Split(SList, TempList) != NULL) { SLL_Merge(SList, TempList, List); SList = List; } return ; } h, Sao chép mét danh sich: Thyc chat thao tac nay la ching ta tao mdi danh sch NewList bing cach duyét qua cc nit cla SLList dé ldy thanh phan dif ligu réi tao thanh mot nut méi va bé sung nat méi nay vao cudi danh sch NewList. - Thuat toan: B1: NewList = NULL, B2: CurNode = SLList B3: IF (CurNode = NULL) Thuc hin Bkt B4: SLL_Add_Last(NewList, CurNode->Key) B5: CurNode = CurNode->NextNode B6: Lap lai B3 Bkt: Két thac - Cai dat thuat ton: ng: 10 Guia tink: Cite Puie Dic Litu va Gidt Thue Ham SLL_Copy cé prototype: SLL_Type SLL_Copy (SLL_Type SList, SLL_Type &NewList); Ham thye hién viée sao chép n@i dung danh sach SList thanh danh séch NewList 6 cling n6i dung thanh phan di ligu theo thi’ ty cua céc niit trong SList. Ham tra vé dia chi nat dau trong danh séch méi néu vigc sao chép thanh céng, ngude lai ham tra vé con tré NULL. Noi dung cia ham nhu sau: SLL_Type SLL_Copy (SLL_Type SList, SLL_Type &NewList) { NewList = NULL; SLL_Type CurNode = SList; while (CurNode != NULL) { SLL_Type NewNode = SLL_Add_Last(NewList, CurNode->Key); if (NewNode == NULL) { SLL_Delelte(NewList); break; CurNode = CurNode->NextNode; 3 return (NewList); ) 4.4.3. Danh sach lién két kép (Doubly Linked List) A. Cau trac dif ligu: Néu nbu ving lién két cla danh séch lién két den c6 01 méi lien két véi 01 phan tt khac trong danh séch thi ving lién két trong danh sach lign d6i cé 02 méi lien két di 02 phn tif khdc trong danh sch, c&u tric dif ligu cla méi nut trong danh séch lign két 46) nhu sau typedef struct DLL_Node (T Key; InfoType Info; DLL_Node * NextNode; // Vang lign két quan ly dia chi phan tit ké tiép né DLL_Node * PreNode; // Viing lién két quan ly dia chi phan tit truée né } DLL_OneNode; 6 day ching ta cing gia thiét rang ving dif ligu ca méi phan tu trong danh sach lien két 0i chi bao gém mot thanh phan khéa nhan dign (Key) cho phan tt 46, Do vay, edu tric dif ligu trén cé thé viét lai dan gin nhu sau: typedef struct DLL_Node { T Key; DLL_Node * NextNode; // Vang lién két quan ly dia chi phan tir ké tiép né DLL_Node * PreNode; // Ving lien két quan ly dia chi phan tit truée né } DLL_OneNode; typedef DLL_OneNode * DLL_Type; C6 nhigu phuong phép khac nhau dé quan ly cc danh sach lién két déi va tudng ing véi céc phucng phép nay sé cé cdc cdu trac dif ligu khde nhau, cy thé: Trang: 111 Guia tink: Cite Puie Dic Litu va Gidt Thue - Quan Iy dja chi phin ti déu danh sich: Céch nay hoan toan tudng ty nhu déi véi danh sach lién két dan. DLL_Type DLL_List!; Hinh anh minh hoa: DLL_List1 NOLL, oe oe - . a te [15 le «| 18 2/40 ME NGL - Quén Iy dja chi phén ti déu va cuéi danh séch: typedef struct DLL_PairNode ( DLL_Type DLL First; DLL_Type DLL_Last; ) DLLP_Type; DLLP_Type DLL_List2; Hinh anh minh hoa: DLL_List2 f* DLL First] DLL_Last © NOLL. - a o> te [15 10 {,| 40 1/30 [°7 | NQLL - Quan Ij dia chi phan ti déu, dja chi phén ti cuéi va 86 phén ti trong danh sch: typedef struct DLL_PairNNode ( DLL Type DLL First; DLL_Type DLL_Last; unsigned NumNode; } DLLPN_Type; DLLPN_Type DLL_List3; Hinh anh minh hoa: DLL_List3 INumNode~6 20 NQLL B, Cac thao tac trén danh sach lién két di: Cung nhu trong phan danh séch lién két don, céc thao téc tutng ting véi méi céch quan ly khéc nhau clia danh sach lién két doi cé sy khac nhau vé mat chi tiét song ngi dung cd ban it co sy khac nhau. Do vay, 6 day chiing ta chi trinh bay cdc thao tac theo cach quan ly thif hai (quan ly céc dia chi ciia hai nuit déu va cudi danh séch lign két d6i), céc thao tc nay trén cac cach quan ly khéc sinh vién ty van dung 4é digu chinh cho thich hgp. Trang: 12 Guia tink: Cite Puie Dic Litu va Gidt Thue a, Khdi tao danh sdch (Initialize): Trong thao tac nay chi den gidn 1a ching ta cho gia tri céc con tré quan ly dia chi hai nat dau va cuéi danh sach lién két d6i v con tré NULL. Ham khéi tao danh séch lien két 461 nhu sau: DLLP_Type DLL_Initialize(DLLP_Type &DList) { DList.DLL_First = NULL; DList.DLL_Last = NULL; return (DList); } Hinh anh minh hoa: Dist NULL «—+epLL First | DLL_Laste- >» NULL b. Tao méi mét phan tit / nit: Gid str ching ta cn tao méi mot phan tif cé thanh phan div ligu la NewData. - Thust ton: B1: DNode = new DLL_OneNode 2: IF (DNode = NULL) Thye hign Bkt B3: DNode->NextNode = NULL B4: DNode->PreNode = NULL BD; DNode->Key = NewData Bkt: Két thac + Cai dgt thugt ton: Ham DLL_Create_Node cé prototype: DLL_Type DLL_Create_Node(T NewData); Ham tgo méi mét nut cé thanh phan dif ligu la NewData, ham tra vé con tré ted tdi dia chi cila nuit méi tao. Néu khéng dii bO nhé dé tao, ham tr vé con tré NULL. DLL_Type DLL_Create_Node(T NewData) { DLL Type Pnode = new DLL_OneNode; if (Pnode != NULL) { Pnode->NextNode = NULL; Pnode->PreNode = NULL; Pnode->Key = NewData; } return (Pnode); } - Minh hea thuat toan: Gia si chiing ta cn to nut c6 thanh phan dit ligu la 20: NewData = 20 Trang: 13 Guia tink: Cite Puie Dic Litu va Gidt Thue Pnode = new DLL_OneNode Paode . ef te Pnode->NextNode = NULL Pnode-»PreNode = NULL Pode-Key = NewData Pnode © e+ Nau «to| 2° NGLL c. Thém m6t phan tt vao trong danh sc! Gia sit chung ta cén thém mot phan tit c6 gid tri thanh phan dif ligu la NewData vao trong danh sch. Viée thém cé thé dién ra 6 dau, cudi hay @ gidta danh sach lien két. Do vay, 6 day chiing ta trinh bay 3 thao tac thém riéng biét nhau: - Thu: toan them phan tif vao dau danh séch lign két d B1: NewNode = DLL_Create_Node (NewData) B2: IF (NewNode = NULL) Thue hign Bkt B3: IF (DLL_List.DLL First = NULL) —_// Danh sch rng 3.1: DLL_List-DLL_First = NewNode B3.2: DLL_List.DLL_Last = NewNode B3.3: Thye hién Bkt B4: NewNode->NextNode = DLL_List.DLL_First // N6i DLL_First vao B5: DLL_List.DLL_First-»PreNode = NewNode _// sau NewNode if Chuyén vai tré ding dau ca NewNode cho DLL_First BG: DLL_List.DLL_First = NewNode Bkt: Két thc - Minh hoa thugt toan: Gia sis chung ta cdn them nut ¢6 thanh phan dif ligu 18 27: NewData = 27 NewNode—y SL NOLL +te|27 NQLL DLL List © DLL First|DLL_Last © NULL Ly = =| ve 20 |* 40 2/30 NOLL NewNode->NextNode = DLL_List.DLL_First: Trang: 114 Guia tink: Cite Puie Dic Litu va Gidt Thue NewNode o—s a «te|27 NOLL, DLL List DLL First/DLL_Last ® NOLL. +f . . a a PreNode = NewNode: NewNode & 27 NGL. DLL List * DLL First|DLL_Last ® NOLL. Ly a je | 16 aa DLL_List. DLL First = NewNode: NewNode - «fe[27 NOLL, DLL, List DLL_First|DLL_Last © NOLL. Ly a le «| 20 18 I Két qua sau khi chen: DLL List +® DLL First|DLL_Last © NOLL. 4 — i+ 7 + a a «le [27 | 16 Le] 20 |*h 1] 18 {,| 40 1/30 [* | Nadu - Thu@t ton thém phan tif vao cudi danh sach lién két d6i: B1: NewNode = DLL_Create_Node (NewData) B2: IF (NewNode = NULL) Thue hin Bkt B3: IF (DLL_List.DLL_First = NULL) ——_// Danh sch rng Guia tink: Cite Puie Dic Litu va Gidt Thue B3.1; DLL_List.DLL_First = NewNode 3.2: DLL_List.DLL_Last = NewNode B3.3: Thy hién Bkt B4; DLL_List.DLL_Last->NextNode = NewNode // N6i NewNode vao B5: NewNode->PreNode = DLL_List.DLL_Last //sau DLL_Last // Chuyén vai tr dting cudi cla NewNode cho DLL_Last BG: DLL_List.DLL_Last = NewNode Bkt: Két thac - Minh hoa thuat ton: Gia siz chiing ta cn thém nut cé thanh phan dif ligu la 25: NewData = 25, NewNode (aL ‘— 25 ee NQLL DLL List P® DLL First] DLL Last © eps PA NaLI 18 5 DLL_List.DLL_Last->NextNode = NewNode: NewNode NQLL DLL List F* DLL First|DLL_Last * - 5 She Pele [Pele Petal Pals FL. NewHode-»PreNode = DLL ListDLL Lest newtode maw. Fi |® DLL_First|DLL_Last © a le so FI] Trang: 116 Guia tink: Cite Puie Dic Litu va Gidt Thue DLL_List.DLL_Last = NewNode: | ® DLL_First| DLL_Last * 16 1 Két qua sau khi chén: ‘® DLL_First|DLL_Last © [ wa :: —_ + te/16 ° 0/25 - Thuat toan thém phan tif vao giifa danh sach lién két déi Gia sit ching ta can thém mét phan tif c6 gia tri thanh phan dif ligu la NewData vao trong danh séch DLL_List vao ngay sau nut c6 dja chi InsNode. Trong thyc té nhigu khi chting ta phai thu hién thao tac tim kiém dé xac dinh dia chi InsNode, & day gid stt chung ta da xéc dinh duge dia chi nay. B1: IF (InsNode->NextNode = NULL) // Thém vao cui DSLK B1.1: DLL_Add_Last (DLL_List, NewData) B1.2: Thyc hign Bkt B2: NewNode = DLL_Create_Node (NewData) B3: IF (NewNode = NULL) Thue hign Bkt //N6i cc nut ké sau InsNode vao sau NewNode B4; NewNode->NextNode = InsNode->NextNode B5; InsNode->NextNode-»PreNode = NewNode // Chuyén méi lién két gia InsNode véi nut ké cia né vé NewNode B6: InsNode->NextNode = NewNode B7: NewNode->PreNode = InsNode Bkt: Két thac - Minh hoa thuat ton: Gia sif ching ta cén thém nuit cé thanh phan dif ligu 1a 25 vo sau nut 6 dia chi InsNode nhu sau: NewData = 25 Trang: 117 Guia tink: Cite Puie Dic Litu va Gidt Thue DLL List, +® DLL_First| DLL Last ©} InsNodk ele [is [PL | 20/°71,] 18 |* ~1e| 30 NaLI NewNode 3 Natt NewNode->NextNode = InsNode->NextNode: DLL List © DLL First| DLL Last © InsNodk 16 4 20 NOLL InsNode->NextNode-»PreNode = NewNode: Le Natt DLL List F* DLL First DLL_Last © 16 InsNode->NextNode = NewNode: * ie nat DLL_List |® DLL First|DLL Last © whe [is lt Nau NewNode 25 naut NewNode->PreNode = InsNode Guia tink: Cite Puie Dic Litu va Gidt Thue DLL _List F* DLL_First|DLL_Last © FL 25 NaLI Két qua sau khi chen: DLL_List fe DLL_First| DLL_Last © 16 «| 20 ‘ Nau = Cai dat thuat toan: Cac ham them phén tit tuong ting véi cdc truéng hgp cé prototype nhut sau: DLLType DLL_Add First(DLLP_Type &DList, T NewData); DLL_Type DLL_Add_Last(DLLP_Type &DList, T NewData); DLL_Type DLL_Add_Mid(DLLP_Type &DList, T NewData, DLL_Type &InsNode); Ham thy hign vic chén phan ti cé gid tri thanh phan dif ligu NewData vao trong danh sach lién két déi quan ly béi hai con tré déu va cudi danh sch trong DList tung ting véi 3 truéng hgp: Them dau, them cuéi, thém gitfa. Cac ham tra vé gid tri la mot dia chi cda niit via méi thém néu vie thém thanh cng. Trong truéng hgp nguge lai, cc ham tra vé con tré NULL. Riéng déi véi truéng hgp thém gitfa, ham DLL_Add_Mid thyc hign vie them vao gay sau nut cé6 dia chi InsNode. Noi dung cia céc ham nhu sau: DLLType DLL_Add_First(DLLP_Type &DList, T NewData) { DLLType NewNode = DLL_Create_Node(NewData); if (NewNode == NULL) return (NULL); if (DList. DLL_First == NULL) DList.DLL_First = DList.DLL_Last = NewNode; else { NewNode->NextNode = DList.DLL_First; DList.DLL_First->PreNode = NewNode; DList.DLL_First = NewNode; } return (NewNode); I DLL_Type DLL_Add_Last(DLLP_Type &DList, T NewData) Trang: 12 Guia tink: Cite Puie Dic Litu va Gidt Thue { DLL Type NewNode = DLL_Create_Node(NewData); if (NewNode == NULL) return (NULL); if (DList. DLL_Last == NULL) DList.DLL_First = DList.DLL_Last = NewNode; else { DList.DLL_Last->NextNode = NewNode; NewNode->PreNode = DList.DLL_Last; DList.DLL_Last = NewNode; 4 return (NewNode); DLL_Type DLL_Add_Mid(DLLP_Type &DList, T NewData, DLL_Type &InsNode) ( DLL_Type NewNode = DLL_Create_Node(NewData); if (NewNode == NULL) return (NULL); if (InsNode->NextNode == NULL) { InsNode->NextNode = NewNode; NewNode->PreNode = InsNode; DList.DLL_Last = NewNode; } else { NewNode->NextNode = InsNode->NextNode; InsNode->NextNode->PreNode = NewNode; InsNode->NextNode = NewNode; NewNode->PreNode = InsNode; } return (NewNode); ) d. Duy@t qua cdc nuit trong danh séch: Thao tac nay nham nhiéu muc dich, ¢ day don gidn ching ta chi duyét dé xem noi dung thanh phan dif ligu trong danh sach. Thuat ton nay hoan toan tudng ty nh trong danh sich lién két don. = Thuat toan: B1: CurNode = DLL_List.First B2: IF (CurNode = NULL) Thye hién Bt B3: OutputData(CurNode->Key) —_// Xuat gié trj thanh phén dif ligu trong 1 nut B4; CurNode = CurNode-»NextNode BS: Lap lai B2 Bkt: Két thac ~ Cai dt thuat ton: Ham DLL_Travelling 6 prototype: Guia tink: Cite Puie Dic Litu va Gidt Thue void DLL_Travelling(DLLP_Type DList); Ham duyét qua cac nut trong danh sach lién két déi quan ly bdi hai dja chi nat dau tign va nut cudi cing théng qua DList dé xem noi dung thinh phan di ligu cla méi nat. Noi jung ca ham nbu sau: void DLL_Travelling (DLLP_Type DList) ( DLL_Type CurNode = DList.DLL_First; while (CurNode != NULL) { OutputData(CurNode->Key); CurNode = CurNode->NextNode; 3 return; ) > Luu ¥: Ham OutputData thc hign viée xudt ndi dung cia mét bién cé kigu dif ligu T. Tay vao ting trudng h¢p cy thé ma chiing ta viét ham OutputData cho phi hgp. ¢. Tim kiém m6t phéin tit trong danh sach: Gia sif chiing ta can tim kiém xem trong danh sch lién két d6i c6 tén tai nuit c6 thanh phén du ligu la SearchData hay khong. Thao tac nay chiing ta van dung thuat, toan tim tuyén tinh dé tim kiém. = Thuat toan: B1: CurNode = DLL_List.DLL_First B2: IF (CurNode = NULL OR CurNode->Key = SearchData) Thue hign Bkt B3: CurNode = CurNode->NextNode Bé: Lap lai B2 Bkt: Két thic = Cai dat th toan: Ham DLL. Searching c6 prototype: DLL_Type DLL_Searching(DLLP_Type DList, T SearchData); Ham thye hign viée tim kiém nit cé thanh phan dif ligu la SearchData trén danh sach lién két doi quan ly béi hai dia chi nit dau tién va nit cudi cung thong qua DList. Ham tra vé dia chi ca nut dau tién trong danh séch duge tim théy, nguge lai ham tra vé con tré NULL Noi jung ca ham nbu sau: DLL_Type DLL_Searching(DLLP_Type DList, T SearchData) (DLL_Type CurNode = DList-DLL_First; while (CurNode != NULL) { if (CurNode->Key == SearchData) break; CurNode = CurNNode->NextNode; } Trang: 121 Guia tink: Cite Puie Dic Litu va Gidt Thue return (CurNode); 7 S- Logi bé bét mét phan tit ra khoi danh sdch: Gia st ching ta cdn loai bé phan tif 6 gid tri thanh phan dif liéu la DelData trong danh sach lién két 46i, Dé thyc hign digu nay truéc tién chung ta phai thc hign thao tac tim kiém dia chi cia nut cé thanh phan di ligu la DelData, sau dé méi thc hién thao tac logi bé néu tim thay. - Thuat ton: 1] Tim kiém nut ¢6 Key 1a DelData trong danh séch B1: DelNode = DLL_Searching(DLL_List, DelData) B2: IF (DelNode = NULL) Thuc hign Bkt Ji Loai bé nat tai dia chi DelNode ra khéi danh séch B3: IF (DelNode->PreNode = NULL AND DelNode->NextNode = NULL) B3.1: DLL_List.DLL_First = DLL_List.DLL_Last = NULL B3,2: Thye hién B8 B4: IF (DelNode->PreNode = NULL) —_// Loai ba nut dau tién trong danh sch B4.1: DLL_List.DLL_First = DLL_List.DLL_First->NextNode 4.2: DLL_List.DLL_First-»PreNode = NULL B4,3: Thye hi¢n B8 B5: IF (DelNode->NextNode = NULL) // Loai bé nuit cudi cing trong danh sch 5.1; DLL_List-DLL_Last = DLL_List.DLL_Last->PreNode B5,2: DLL_List.DLL_Last->NextNode = NULL 5,3: Thye hién BB // Lien két céc nét truée va sau DelNode véi nhau BE: DelNode->PreNode->NextNode = DelNode->NextNode B7: DelNode->NextNode->PreNode = DelNode->PreNode 1/86 méi lin két gitta DelNode vdi hai niit truée va sau né, va hy DelNode B8: DelNode->NextNode = DelNode-»PreNode = NULL B9: delete DelNode Bkt: Két thac ~ Cai dgt thugt toan: Ham DLL_Delete_Node cé prototype: int DLL_Delete_Node (DLLP_Type &DList, T DelData); Ham thy hign viée x6a phan tif cé thanh phan dif ligu la DelData trong danh séch lien két doi quan ly béi hai con tré déu va cudi ghi nhan trong DList. Ham tra vé gia tri 1 néu vige x6a thanh céng va ngu¢c lai, ham tra vé gia tri -1. NOi dung cia ham nhu sau: int DLL_Delete_Node (DLLP_Type &DList, T DelData) { DLL Type DelNode = DLL_Searching(DList, DelData); if (DelNode == NULL) return (-1); Trang: 122 Geko trink: Cite Tuie Dit Lite ua Guidi Vhnst if (DelNode->NextNode == NULL && DelNode->PreNode == NULL) DList.DLL_First = DList.DLL_Last = NULL; else if (DelNode-»PreNode == NULL) ( DList.DLL_First = DList.DLL_First->NextNode; DList.DLL_First-+PreNode = NULL; else if (DelNode->NextNode == NULL) { DList.DLL_Last = DList.DLL_Last->PreNode; DList.DLL_Last->NextNode = NULL; else {_ DelNode->PreNode->NextNode = DelNode->NextNode; DelNode->NextNode->PreNode = DelNode->PreNode; DelNode->NextNode = DelNode->PreNode = NULL; delete DelNode; return (1); ) h hoa thuat toan: + Hy nut dau: DelData = 16 DLL_List fe DLL_First| DLL_Last © NULL 18 30 ist. DLL_First->NextNode * DLL First] DLL Last © 20 L.| 18 DLL_List. DLL_First-»PreNode ULL © DLL_First|DLL_Last © DglNode HH ] «tel 16 le} 20/°L "| 18 [*U1,| 25 NdLI NULL DelNode->NextNode = DelNode->PreNode = NULL; Trang: 125 Guia tink: Cite Puie Dic Litu va Gidt Thue DLL _List * DLL First[DLL_Last © DglNode NULL. NOLL. * * Oe “> «te[16 le 18 25 |*1.| 40 [* 71. [30 NdL NOLL, Két qua sau khi hay: DLL_List DLL First] DLL_Last © + > * ‘ 20 | 18 1.| 25 40 NOLL. + Hy nuit cudi: DelData DLL_List DLL First] DLL_Last © DelNode, NOLL. Ly a + [o|16 —| NGL DLL_List.DLL_Last = DLL_List.DLL_Last->PreNode DLL_List * DLL First[DLL_Last e] jode NULL. . . . a whee PRT 20 CRT 2 Pies Pa 20 30 Nau DLL_List. DLL_Last->NextNode = NULL DLL_List * DLL First[DLL_Last & NOLL jeINode NULL. Ly a é a «le |16 a) 18 1.| 25 _t.{3° NdL DelNode->NextNode = DelNode->PreNode = NULL DLL_List DLL First[DLL_Last & NOLL jeINode NULL. «le |16 2 as [PL 30 Nau Két qua sau khi hay: Trang: 124 Guia tink: Cite Puie Dic Litu va Gidt Thue DLL _List © DLL_First|DLL_Last NGL, Ly a > * + «le |16 a 1s [®t 25 [tT] 40 NdL + Hy nuit gira cn hiy nat cé6 thanh phan dif ligu la 18 (DelData = 18) DLL_List DLL First] DLL_Last © DelNodey, NOLL. Ff + a 7 le |16 20/*)"1,| 18 [I 16 | 3° NaLE DelNode->PreNode-»NextNode = DelNode->NextNode DLL_List © DLL_First|DLL_Last © 25 lode reNode © DLL_First|DLL_Last © fe] 20|*| {| 18 NOLL ‘DelNodeg™ DelNode-»NextNode = DelNode->PreNode = NULL DLL_List * DLL_First[DLL_Last © NOLL NULL NULL 4 7 Cm a «lel 6 20 Sea 16/30 [*7! nd elNode Két qua sau khi hay: DLL_List DLL First|DLL_Last © NOLL. + ° = + a + fe16 AED Guia tink: Cite Puie Dic Litu va Gidt Thue g. Hily toan b6 dank séch: 6 day, ching ta thyc hign nhiéu lan thao tac hay mot nut. - Thuat toan: B1: IF (DLL_List.DLL_First = NULL) Thye hign Bkt B2: TempNode = DLL_List.DLL_First B3: DLL_List.DLL_First = DLL_List.DLL_First-»NextNode B4: IF (DLL_List.DLL_First = NULL) 4.1: DLL_List.DLL_Last = NULL B4,2: Thyc hién B7 BS: DLL_List.DLL_First-»PreNode = NULL B6: TempNode->NextNode = NULL B7: delete TempNode B8: Lap lai BI Bkt: Két thc = Cai dgt thuat toan Ham DLL_Delete c6 prototype: void DLL_Delete (DLLP_Type &DList); Ham thyc hign viéc hiy toan bo danh sach lién két doi DList Noi jung cla ham nhu sau: void DLL_Delete (DLLP_Type &DList) { DLL Type TempNode = DList.DLL_First; while (TempNode != NULL) { DList.DLL_First = DList.DLL_First->NextNode; ‘TempNode->NextNode = NULL; if (DList. DLL_First != NULL) DList.DLL_First->PreNode = NULL; delete TempNode; TempNode = DList.DLL_ First; } return ; > Luu g: Ching ta cing ¢6 thé van dung ham DLL_Delete_Node dé thyc hign thao tac nay, lac d6 ham DLL_Delete cé thé viét Iai nbu sau: void DLL_Delete (DLLP_Type &DList) ( DLL Type TempNode = DList. DLL. First; while (TempNode != NULL) { DLL_Delete_Node(DList, TempNode->Key); TempNode = DList.DLL_First; } return ; ) Trang: 126 Guia tink: Cite Puie Dic Litu va Gidt Thue h. Tao méi danh séch/ Nhép danh sach: Cang tuang ty nhu trong danh séch lign két den trong thao tac nay, ching ta lién tye thyc hign thao téc thém miét phan tdi vao danh sach ma ban ddu danh sach nay la mét danh séch réng (Gém hai con tré NULL). Ching ta cing cé thé sit dung mét trong ba ham thém phan ti dé them phan ti, é day sts dung ham SLL_Add_Last. Gia st ching ta can tao danh sach lién két doi cé N phan tit, - Thuat toan: B1: DLL_Initialize(DLL_List) B2:i=1 B3:1F (i> N) Thyc hign Bkt Bd: NewData = InputNewData() J/ Nhap gié tri cho bién NewData B5: DLL_Add_Last(DLL_List, NewData) B6: iv B7: Lap lai B3 Bkt: Két thac + Cai dt thudt toan: Ham DLL_Create cé prototype: DLLP_Type DLL_Create (DLLP_Type &DList, int N); Ham tao danh séch lign két d6i cé N nut quan ly bai hai dia chi nut dau tien va nit cudi cling théng qua DList. Ham tra vé gia tri ghi nhan hai dia chi cua nut dau tin va nit cuéi cling trong danh sach néu vigc tao thanh céng, ngugc lai ham tra vé danh sdch réng (cd hai dia chi déu la gia tri NULL). Noi dung cia ham nhu sau: DLLP_Type DLL_Create(DLLP_Type &DList, int N) { DLL_Initialize(DList); T NewData; for (int i= 0; i < N; i++) { NewData = InputNewData(); if (DLL_Add_Last(DList, NewData) == NULL) { DLL_Delete(DList); break; 3 4 return (DList); > Lit ¥: Ham InputNewData thy hién nhap vao néi dung cla mét bién cé kigu dif ligu T va tr vé gié tri méi nhap vao. Tay vao ting trudng h¢p cu thé ma chung ta viét ham InputNewData cho pha hgp. Trang: 127 Guia tink: Cite Puie Dic Litu va Gidt Thue i, Téch mé6t danh séch thanh nhiéu danh séch: Gia siz ching ta cén thye hign vige tach cdc nut trong danh séch lien két doi DLL_List thanh hai danh séch lién két déi con DLL_List! va DLL_List2 luan phién theo céc dudng chay ty nhién va cén git? lai danh sach lién két ban dau. = Thugt toan: B1: DLL_Initialize(DLL_List1) B2: DLL_Initialize(DLL_List2) B3: CurNode = DLL_List.DLL_First 1/ Cat cae nat tt 1 duéing chay ty nhién vé DLL_List! Ba: IF (CurNode = NULL) Thue hign Bkt BS: DLL_Add_Last(DLL_List1, CurNode->Key) B6: CurNode = CurNode->NextNode B7: IF (CurNode = NULL) Thye hien Bkt BB: IF (CurNode->PreNode->Key > CurNode->Key) Thue hién B10 B9: Lap lai Ba // Ct cc nit tw 1 duéng chay ty nhién vé DLL_List2 B10: IF (CurNode = NULL) Thue hign Bkt B11: DLL_Add_Last(DLL_List2, CurNode->Key) B12: CurNode = CurNode->NextNode B13: IF (CurNode = NULL) Thue hign Bkt B14: IF (CurNode->PreNode->Key > CurNode->Key) Thue hign B4 B15: Lap lai B10 Bkt: Két thic ~ Cai d§t thuat toan: Ham DLL_Split c prototype: void DLL_Spli(DLLP_Type &DList, DLLP_Type &DList1, DLLP_Type &DList2); Ham thye hién viée phan phéi céc dutng chay ty nhién trong DList thanh vé hai danh sch méi DListl va DList2 (Danh séch ci DList van duge gitt nguyén). Noi dung cia ham nhu sau: void DLL_Split(DLLP_Type &DList, DLLP_Type &DList!, DLLP_Type &DList2) { DLL_Initialize(DList1); DLL _Initialize(DList2); DLL_Type CurNode = DList.DLL_First; while (CurNode != NULL) { do {if (DLL_Add_Last(DList1, CurNode->Key) = { DLL_Delete (DList1); DLL_Delete (DList2); NULL) Guia tink: Cite Puie Dic Litu va Gidt Thue break; d CurNode = CurNode->NextNode; if (CurNode == NULL) break; if (CurNode->Key < CurNode->PreNode->Key) break; } while (1); if (CurNode == NULL) break; do {if (DLL_Add_Last(DList2, CurNode->Key) { DLL_Delete (DList1); DLL_Delete (DList2); breal ) CurNode = CurNode->NextNode; NaLL) if (CurNode == NULL) break; if (CurNode->Key < CurNode-»PreNode->Key) break; } while (1); } return ; ) J. Nhdp nhiéu danh sdch thanh m6t danh séch: Chiing ta thyc hign thao téc nay trong hai truéng hgp: + Ghép néi duéi céc danh séch Iai véi nhau; + Tron xen lan cae phén ty trong céc danh sach vao thanh mot danh séch theo mot trat ty nhét dinh va sau khi nhap xong vn gitt lai cae danh séch ban dau. Gia sit chiing ta can nhap hai danh séch DLL_Listi va DLL_List2 lai véi nhau thanh mét danh sch DLL_List. - Thuat ton ghép n B1: DLL_Initialize (DLL_List) J Bua DLL_List] vao ddu DLL_List B2: CurNode = DLL_List!.DLL_First B3: IF (CurNode = NULL) Thye hign B7 B4: IF (DLL_Add_Last(DLL_List, CurNode->Key) = NULL) B4.1: DLL_Delete (DLL_List) B4.2: Thyc hign Bkt B5: CurNode = CurNode->NextNode hai danh sach thanh mét danh sich méi Guia tink: Cite Puie Dic Litu va Gidt Thue B6: Lap lai B3 // Dua DLL_List2 vao sau DLL_List B7: CurNode = DLL_List2.DLL_First BB: IF (CurNode = NULL) Thyc hign Bkt B9: IF (DLL_Add_Last(DLL_List, CurNode->Key) = NULL) B4.1: DLL_Delete (DLL_List) B4.2: Thye hién Bkt B10: CurNode = CurNode->NextNode B11: Lap lai BB Bkt: Két thic - Thuat toan trn 2 danh séch thanh 1 danh sach méi theo cdc duéng chay ty nhién: B1: CurNodel = DLL_Listl.DLL_First B2: CurNode2 = DLL_List2.DLL_First B3; IF (CurNodel = NULL OR CurNode2 = NULL) Thy hign B6 B4: IF (CurNode1->Key < CurNode2->Key) B4.1: If (DLL_Add_Last (DLL_List, CurNodel->Key) = NULL) 4.1.1: DLL_Delete(DLL_List) B4,1.2: Thyc hign Bkt 4.2: CurNodel = CurNode1->NextNode B4,3: If (CurNode1 = NULL) Thyc hign B10 4.4: If (CurNode1->PreNode->Key > CurNode1->Key) B4.4.1: if (DLL_Add_Last (DLL_List, CurNode2->Key) = NULL) B4.4.1.1: DLL_Delete(DLL_List) B4.4.1.2: Thue hign Bkt B4.4.2: CurNode2 = CurNode2->NextNode B4.4.3: if (CurNode2 = NULL) Thy hién B6 B4.4.4: if (CurNode2->PreNode->Key > CurNode2->Key) Thue hign B3 B4.4.5: Lap lai B4.4.1 B4.5: Lap lai B4 BS: ELSE B5.1: If (DLL_Add_Last (DLL_List, CurNode2->Key) = NULL) 5.1.1: DLL_Delete(DLL_List) BB,1.2: Thyc hign Bkt 5,2: CurNode2 = CurNode2->NextNode 5,3: If (CurNode2 = NULL) Thye hign B6 5.4: If (CurNode2->PreNode->Key > CurNode2->Key) B5.4.1: if (DLL_Add_Last (DLL_List, CurNode1->Key) = NULL) B5.4.1.1: DLL_Delete(DLL_List) B5.4.1.2: Thue hién Bkt Trang: 130 Guia tink: Cite Puie Dic Litu va Gidt Thue B5.4.2: CurNodel = CurNodel->NextNode B5.4.3: if (CurNodel = NULL) Thy hién B10 B5.4.4: if (CurNodel->PreNode->Key > CurNodel->Key) Thue hién B3 B5.4.5: Lap lai B5.4.1 B55: Lap lai B4 // Bua phan cén lai trong DLL_List! v8 DLL_List B6: IF (CurNode1 = NULL) Thye hign Bkt B7: IF (DLL_Add_Last(DLL_List, CurNode1->Key) = NULL) B7.1: DLL_Delete (DLL_List) 7.2: Thye hién Bkt BB: CurNodel = CurNode1->NextNode B9: Lap lai B6 1/ ua phan cén Iai trong DLL_List2 vé DLL_List B10: IF (CurNode2 = NULL) Thye hign Bt B11: IF (DLL_Add_Last(DLL_List, CurNode2->Key) = NULL) B11.1: DLL_Delete (DLL_List) B11,2: Thye hign Bkt B12: CurNode2 = CurNode2->NextNode B13: Lap lai B1O Bkt: Két thac = Cai dat: Cac ham nhap danh sach c6 prototype: DLLP_Type DLL_Concat (DLLP_Type &DList1, DLLP_Type &DList2, DLLP_Type &DList); DLLP_Type DLL_Merge (DLLP_Type &DListl, DLLP_Type &DList2, DLLP_Type &DList); Ham thye hién viée nhap céc nut trong hai danh sach DList1, DList2 thanh mét danh sach theo hai trugng h¢p da trinh bay trong hai thuat toan trén day. Ham tra vé gia tri cla danh sach sau khi ghép. Ni dung cia cac ham nh sau: DLLP_Type DLL_Concat (DLLP_Type &DList!, DLLP_Type &DList2, DLLP_Type &DList) { DLL_Ihitialize (DList); DLL_Type CurNode = DListl.DLL_First; while (CurNode != NULL) {if (DLL_Add_Last (DList, CurNode->Key) == NULL) { DLL_Delete(DList); return (DList); 3 Trang: 131 Guia tink: Cite Puie Dic Litu va Gidt Thue ‘CurNode = CurNNode->NextNode; 4 CurNode = DList2.DLL_First; while (CurNode != NULL) {if (DLL_Add_Last (DList, CurNode->Key) == NULL) { DLL_Delete(DList); return (DList); ' CurNode = CurNode->NextNode; } return (DList); } I DLLP_Type DLL_Merge (DLLP_Type &DListl, DLLP_Type &DList2, DLLP_Type &DList) { DLLType CurNode! = DList1.DLL First; DLL_Type CurNode2 = DList2.DLL First; while (CurNodel != NULL && CurNode2 != NULL) {if (CurNodel->Key <= CurNode2->Key) { if (DLL_Add_Last (DList, CurNodel->Key) = { DLL_Delete (DList); return (DList); } CurNodel = CurNodel->NextNode; if (CurNodel == NULL) break; if (CurNodel->PreNode->Key > CurNodel->Key) do { if (DLL_Add_Last (DList, CurNode2->Key) == NULL) { DLL_Delete (DList); return (DList); ) CurNode2 = CurNode2->NextNode; NULL) while (CurNode2 != NULL && CurNode2->PreNode->Key <= CurNode2->Key); else { if (DLL_Add_Last (DList, CurNode2->Key) { DLL_Delete (DList); return (DList); } CurNode2 = CurNode2->NextNode; if (CurNode2 == NULL) break; if (CurNode2->PreNode->Key > CurNode2->Key) do { if (DLL_Add_Last (DList, CurNode1->Key) == NULL) { DLL_Delete (DList); NULL) Trang: 192 Guia tink: Cite Puie Dic Litu va Gidt Thue return (DList); y CurNodel = CurNode1->NextNode; 3 while (CurNodel != NULL && CurNodel->PreNode->Key <= CurNodel->Key); 3 } while (CurNodel != NULL) { if (DLL_Add_Last (DList, CurNodel->Key) == NULL) { DLL_Delete (DList); break; 3 CurNodel = CurNodel->NextNod } while (CurNode2 != NULL) { if (DLL_Add_Last (DList, CurNode2->Key) { DLL_Delete (DList); break; CurNode2 = CurNode2->NextNode; } return (DList); ) . Sdp xép thit tu thanh phan dit ligu cdc nit trong danh sdch: Thao téc nay rét thudn tign trong viée 4p dung thuat toin sdp xép tron dé sdp xép, sinh vién cé thé ty thyc hién. G day, ching ta van dung thuat toan sp xép ndi bot 4é sp xép dif lieu - Thuat toan sap xép van dung thuat toan ndi bot: BI: Inode = DLL_List.DLL_First B2: IF (Inode = NULL) Thyc hign Bkt B3: IF (Inode = DLL_List.DLL_Last) Thue hign Bkt Ba: Jnode = DLL_List. DLL_Last B5: IF (Jnode = Inode) Thyc hign B7 B6: ELSE B6.1: If (Jnode->Key < Jnode->PreNode->Key) ‘Swap (Jnode->Key, Jnode-»PreNode->Key) B6.2: Jnode = Jnode->PreNode B6.3: Lap lai BS B7: Inode = Inode->NextNode BB: Lap lai B3 Bkt: Két thac = Cai dat thuat ton: Trang: 193 Guia tink: Cite Puie Dic Litu va Gidt Thue Ham DLL_Bubble_Sort c6 prototype: void DLL Bubble Sort (DLLP_Type &DList); Ham thye hign viéc sap xép thanh phan di’ ligu cia céc nat trong danh séch lién két d6i DList theo thir ty tang dya trén thuat toan sép xép néi bot. Néi dung cda ham nu sau: void DLL_Bubble Sort (DLLP_Type &DList) { DLL Type Inode = DList.DLL_First; if (Inode == NULL) return; while (Inode != DList.DLL_Last) { DLL_Type Jnode = DList.DLL_Last; while (Jnode != Inode) { if (Jnode->Key < Jnode->PreNode->Key) ‘Swap (Jnode->Key, Jnode->PreNode->Key); Jnode = Jnode->PreNode; } Inode = Inode->NextNode; } return ; ) L Sao chép m@t danh sdch thanh mét danh séch m Thao tac nay hoan toan tuong ty nhy trong danh sach lién két don. - Thuat toan: B1: DLL_Initialize(NewList) B2: CurNode = DLL_ListDLL_First B3: IF (CurNode = NULL) Thue hign Bkt B4: DLL_Add_Last(NewList, CurNode->Key) BS: CurNode = CurNode->NextNode B6: Lap lai B3 Bkt: Két thac - Cai dat thugt toan: Ham DLL_Copy cé prototype: DLLP_Type DLL_Copy (DLLP_Type &DList, DLLP_Type &NewList); Ham thye hign viée sao chép néi dung danh séch DList thanh danh séch NewList 6 cing ngi dung thanh phan dif ligu theo thif ty ctia cdc nut trén DList. Ham tra vé gia tri ca danh sach méi néu viéc sao chép thanh cong, nguge lai ham tra vé gia tr) khdi tao cia danh sach. Noi dung cia ham nu sau: DLLP_Type DLL_Copy (DLLP_Type &DList, DLLP_Type &NewList) { DLL_Initialize(NewList); DLL_Type CurNode = DList.DLL_First; Guia tink: Cite Puie Dic Litu va Gidt Thue while (CurNode != NULL) { if (DLL_Add_Last (NewList, CurNode->Key) { DLL_Detete (NewList); break; ' CurNode = CurNode->NextNode; NULL) } return (NewList); ) 4.4.4, Uu nhuge diém cua danh sach lién két Do cae phan tut (nut) duge luu triv khéng lién tiép nhau trong bé nhé, do vay danh sch lién két c6 cae uu nhuge diém sau day: - Mat d@ str dung b6 nhé cia danh sch lign két khéng t6i uu tuyét Adi (< 100%); - Vige truy xudt va tim kiém cdc phan tlt cla danh séch lién két mat nhigu thei gian béi luén lun phai duyét tudn ty qua céc phan ti trong danh sach; Tan dung duge nhting khéng gian bo nhé nhé dé Iu trif tuing nut, tuy nhién bé nhé uu tr théng tin mdi nat lai tén nhigu han do cén phai lu thém théng tin vé ving lign két. Nhu vay néu ving dif ligu ca méi nat la Ién han thi ty 1g mic tiéu ton bo nhé nay la khéng dang ké, ngudc lai thi né lai gay lang phi bo nhé. - Vige thém, bét céc phan tt trong danh sach, tach nhgp céc danh sach kha dé dang do chiing ta chi cn thay déi méi lién két gitta cac phan tif véi nhau. 4.5. Danh sch han ché Trong céc thao téc trén danh sch khéng phai lic nao ciing cé thé thyc hién duge t8t cd ma nhiéu khi céc thao tac nay bj han ché trong mot s6 logi danh sach, dé la danh sch han ché. Nhu vay, danh séch han ché la danh sach ma cdc thao téc trén dé bj han ché trong mét chiing myc nao dé tay thuge vao danh sach. Trong phan nay chiing ta xem xét hai loai danh séch han ché chui yéu dé Ia: - Hang dgi (Queue); - Ngan xép (Stack) 4.5.1, Hang dgi (Queue) A. Khai nigm - Cu trac dit ligu: Hang dgi la mét danh sich ma trong dé thao téc them mét phan tl vao trong danh sach duge thyc hién d mét déu nay va thao téc Idy ra mot phan ti ty trong danh sch lai duge thye hién & dau kia Nhu vay, cde phan tir duge dua vao trong hang dgi true sé duge lay ra trude, phan tte dua vao trong hang dgi sau sé duge léy ra sau. Do 46 ma hang dgi cn duge gol 1a danh séch vao trudc ra true (FIFO List) va cau tric dif liu nay cén duge goi la cu tric FIFO (First In - First Out) Co nhigu céch dé biéu dién va t6 chic caching dgi: Trang: 135

Вам также может понравиться