680 likes | 853 Views
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT. SINH VIEÂN THÖÏC HIEÄN. 1. Nguyeãn Thò Hoàng Nhi MSSV:K30-101-066. 2. Traàn Minh Phöông MSSV:K30-101-074. LỚP:3/B. SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT.
E N D
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT
SINH VIEÂN THÖÏC HIEÄN 1. Nguyeãn Thò Hoàng Nhi MSSV:K30-101-066 2. Traàn Minh Phöông MSSV:K30-101-074 LỚP:3/B
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT Moät danh saùch coù thöù töï (danh saùch ñöôïc saép) laø moät danh saùch maø caùc phaàn töû cuûa noù ñöôïc saép xeáp theo moät thöù töï naøo ñoù döïa treân moät tröôøng khoaù. Ví duï : Danh saùch caùc phaàn töû soá coù thöù töï taêng laø danh saùch maø vôùi moïi caëp phaàn töû X, Y ta luoân coù X < = Y neáu X xuaát hieän tröôùc Y trong danh saùch. Chuù yù : danh saùch coù 1 hoaëc khoâng coù phaàn töû naøo ñöôïc xem laø moät danh saùch ñöôïc saép.
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT Caùc caùch tieáp caän: • Phöông aùn 1 (thao taùc treân vuøng Info) : Hoaùn vò noäi dung caùc phaàn töû trong danh saùch. • Phöông aùn 2 (thao taùc treân vuøng Next) : Thay ñoåi caùc moái lieân keát
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT Phöông aùn 1 : • Caøi ñaët laïi treân xaâu moät trong nhöõng thuaät toaùn saép xeáp ñaõ bieát treân maûng. • Ñieåm khaùc bieät duy nhaát laø caùch thöùc truy xuaát ñeán caùc phaàn töû treân xaâu thoâng qua lieân keát thay vì chæ soá nhö treân maûng. • Do thöïc hieän hoaùn vò noäi dung cuûa caùc phaàn töû neân ñoøi hoûi söû duïng theâm vuøng nhôù trung gian chæ thích hôïp vôùi caùc xaâu coù caùc phaàn töû coù thaønh phaàn Info kích thöôùc nhoû. • Khi kích thöôùc cuûa tröôøng Info lôùn, vieäc hoaùn vò giaù trò cuûa hai phaân töû seõ chieám chi phí ñaùng keå. • Khoâng taän duïng ñöôïc caùc öu ñieåm cuûa xaâu!
THAO TAÙC TREÂN VUØNG INFO void ListSelectionSort (LIST &l) { NODE *min; NODE *p, *q; p = l.pHead; while ( p != pTail ) { q = ppNext; min = p; while ( q != NULL ) { if ( qInfo < minInfo ) min = q; q = qpNext; } Hoanvi ( minInfo, pInfo); p = ppNext; } }
THAO TAÙC TREÂN VUØNG NEXT Phöông aùn 2: • Do caùc nhöôïc ñieåm cuûa caùc phöông phaùp saép xeáp theo phöông aùn 1, khi döõ lieäu löu taïi moãi phaàn töû treân xaâu coù kích thöôùc lôùn ta thöôøng duøng moät caùch tieáp caän khaùc : + Thay vì hoaùn ñoåi giaù trò, ta seõ tìm caùch thay ñoåi trình töï moùc noái cuûa caùc phaàn töû sao cho taïo laäp neân ñöôïc thöù töï mong muoán chæ thao taùc treân caùc moùc noái (pNext). + Kích thöôùc cuûa tröôøng pNext: • Khoâng phuï thuoäc vaøo baûn chaát döõ lieäu löu trong xaâu • Baèng kích thöôùc 1 con troû (2 hoaëc 4 byte trong moâi tröôøng 16 bit, 4 hoaëc 8 byte trong moâi tröôøng 32 bit…) + Thao taùc treân caùc moùc noái thöôøng phöùc taïp hôn thao taùc tröïc tieáp treân döõ lieäu. Caàn caân nhaéc khi choïn caùch tieáp caän: Neáu dữ lieäu khoâng quaù lôùn thì neân choïn phöông aùn 1 hoaëc moät thuaät toaùn hieäu quaû naøo ñoù.
THAO TAÙC TREÂN VUØNG NEXT • Moät trong nhöõng caùch thay ñoåi moùc noái ñôn giaûn nhaát laø taïo moät danh saùch môùi laø danh saùch coù thöù töï goàm caùc phaàn töû trích töø danh saùch cuõ. Giaû söû danh saùch môùi seõ ñöôïc quaûn lyù baèng con troû ñaàu xaâu Result, ta coù thuaät toaùn choïn tröïc tieáp của phöông aùn 2 nhö sau: • B1: Khôûi taïo danh saùch môùi Result laø roãng; • B2: Tìm trong danh saùch cuõ l phaàn töû nhoû nhaát – min; • B3: Taùch min khoûi danh saùch cuõ; • B4: Cheøn min vaøo cuoái danh saùch Result; • B5: Laëp laïi böôùc 2 khi chöa heát danh saùch cuõ;
THAO TAÙC TREÂN VUØNG NEXT Ví duï : min pTail 1 pHead 1 13 3 9 7 16 pHead2 pTail2 pTail2
13 THAO TAÙC TREÂN VUØNG NEXT min pTail 1 pHead 1 9 7 16 pHead2 3 pTail2 pTail2
THAO TAÙC TREÂN VUØNG NEXT min pTail 1 pHead 1 13 9 16 pHead2 3 7 pTail2 pTail2
THAO TAÙC TREÂN VUØNG NEXT min pTail 1 pHead 1 13 16 pHead2 3 7 9 pTail2 pTail2
THAO TAÙC TREÂN VUØNG NEXT min pTail 1 pTail 1 pHead 1 16 pHead2 3 7 9 13 pTail2 pTail2
THAO TAÙC TREÂN VUØNG NEXT pTail 1 pHead 1 pTail2 pHead2 3 7 9 13 16
THAO TAÙC TREÂN VUØNG NEXT NODE * FindMinprev (LIST &l1) // Tìm phaàn töû ñöùng tröôùc min trong danh saùch { NODE *min ; // chæ ñeán phaàn töû coù giaù trò nhoû nhaát trong xaâu NODE *p, *q, *minprev; p = l1.pHead; q = ppNext; min = p; minprev = NULL; while (q != NULL) { if (qInfo < minInfo) { min = q; minprev = p;//chæ phaàn töû ñöùng tröôùc min trong xaâu } p = q; q = qpNext; } return minprev; }
THAO TAÙC TREÂN VUØNG NEXT void ListSelectionSort2 (LIST &l1) { LIST lRes; NODE *min, *minprev; init ( lRes ); // khôûi taïo danh saùch môùi while(l1.pHead != NULL) { minprev = FindMinprev(l1); min = PickAfter(l1, minprev);// Laáy phaàn töû min AddTail(lRes, min);// Cheøn min vaøo cuoái danh saùch l2 } l1 = lRes; }
THUAÄT TOAÙN QUICK SORT
THUAÄT TOAÙN QUICK SORT Böôùc 1: Neáu DS coù ít hôn 2 phaàn töû thì döøng. Böôùc 2:Choïn X laø phaàn töû ñaàu danh saùch laøm phaàn töû caàm canh. Loaïi X ra khoûi danh saùch. Böôùc 3:Taùch DS ra laøm DS1 (goàm phaàn töû X) vaø DS2 (goàm caùc phaàn töû >X). Böôùc 4:Neáu DS1!=NULL thì Quick sort (DS1). Böôùc 5:Neáu DS2!=NULL thì Quick sort (DS2). Böôùc 6: Noái DS1 – X – DS2 ta coù DS ñaõ ñöôïc saép xeáp.
3 2 9 4 1 5 3 VÍ DỤ VÍ DỤ Saép xeáp daõy soá sau theo thöù töï taêng daàn: 3 5 4 1 9 2 Saép xeáp daõy soá sau theo thöù töï taêng daàn: 3 5 4 1 9 2 pHead pHead pTail
X 2 9 4 1 5 3 pHead Choïn phaàn töû ñaàu tieân laøm phaàn töû caàm canh
X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds
X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds
X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds
X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds
X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds
X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds
X 3 9 4 5 1 2 Vaäy ta ñöôïc DS1 vaø DS2 nhö sau pHead ds2 ds1
X 9 5 4 2 1 3 Saép xeáp DS1 vaø DS2 theo Quick sort pHead ds1 ds2
9 5 4 3 2 1 Noái Ds1 – X – Ds2 vaø ñöa keát quaû vaøo pHead pHead
Nhaän xeùt: • Quick sort treân DS ñôn ñôn giaûn hôn phieân baûn cuûa noù treân maûng moät chieàu. • Khi duøng quick sort saép xeáp moät DS ñôn, chæ coù moät choïn löïa phaàn töû caàm canh duy nhaát hôïp lyù laø phaàn töû ñaàu DS. Choïn baát kyø phaàn töû naøo khaùc cuõng laøm taêng chi phí moät caùch khoâng caàn thieát do caáu truùc töï nhieân cuûa DS ñoù.
voidInit(List &l) // Khôûi taïo DS roãng { l.pHead = l.pTail = NULL; } NODE*PickHead(List &l)//Trích phaàn töû ñaàu DS { NODE*p = NULL; if (l.pHead != NULL) { p = l.pHead; l.pHead = l.pHead->pNext; p->pNext = NULL; if(l.pHead == NULL) l.pTail = NULL; } return p; }
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT voidNoi_2_ds(List &ds, List &ds1) { if (ds1.pHead == NULL) return; if (ds.pHead == NULL) ds = ds1; else { ds.pTail->pNext = ds1.pHead; ds.pTail = ds1.pTail; } Init(ds1); }
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT voidQuicksort_ds(List &ds) { NODE *X, *p; //X laø phaàn töû caàm canh List ds1, ds2; if (ds.pHead == ds.pTail) return;//ñaõ coù thöù töï Init(ds1); Init(ds2); X = PickHead(ds); while (ds.pHead != NULL) //taùch DS thaønh DS1, DS2. { p = PickHead(ds); if (p->Info <= X->Info) Addtail(ds1, p); else Addtail(ds2, p); } Quicksort_ds(ds1); Quicksort_ds(ds2); Noi_2_ds(ds, ds1); Addtail(ds, X); Noi_2_ds(ds, ds2); }
THUAÄT TOAÙN MERGE SORT
THUAÄT TOAÙN MERGE SORT Böôùc 1: Neáu DS coù ít hôn 2 phaàn töû thì döøng. Böôùc 2: Phaân phoái luaân phieân DS vaøo 2 danh saùch DS1 vaø DS2. Böôùc 3: Neáu DS1!=NULL thì Merge sort (DS1). Böôùc 4: Neáu DS2!=NULL thì Merge sort (DS2). Böôùc 5: Troän DS1 vaø DS2 ñaõ ñöôïc saép xeáp laïi thì ta coù DS ñaõ ñöôïc saép xeáp.
VÍ DỤ 2 9 1 4 5 3 Saép xeáp daõy soá sau theo thöù töï taêng daàn: 3 5 4 1 9 2 pHead pTail
pHead pHead 4 2 9 1 2 5 5 3 9 1 4 3 pHead Ds1 Ds2
pHead pHead pHead 5 3 5 3 9 1 9 1 Saép xeáp Ds1 theo Merge sort Ds1 Ds1.1 Ds1.2
pHead pHead pHead 4 2 9 5 3 1 Ds1 ñaõ ñöôïc saép xeáp Ds1 Ds1 DS 2 ñaõ ñöôïc saép xeáp Ds2
9 5 4 3 2 1 Troän Ds1 vaø Ds2 laïi ta coù Ds ñaõ ñöôïc saép xeáp theo Merge sort pHead
Nhaän xeùt: • Merge sort treân DS ñôn ñôn giaûn hôn phieân baûn treân maûng moät chieàu. • Khi duøng Merge sort saép xeáp moät DS ñôn, khoâng caàn duøng theâm vuøng nhôù phuï nhö khi caøi ñaët treân maûng moät chieàu. • Thuû tuïc Merge treân DS ñôn khoâng phöùc taïp nhö treân maûng vì chæ phaûi troän hai DS ñaõ coù thöù töï, trong khi treân maûng phaûi troän hai maûng baát kyø.
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT voidMergeSort_ds(List & ds) { List ds1, ds2; if (ds.pHead == ds.pTail) return;//ñaõ coù thöù töï Init(ds1); Init(ds2); //Phaân phoái DS vaøo DS1 vaø DS2 Distribute_ds(ds, ds1, ds2); if (ds2.pHead) { MergeSort_ds(ds1); MergeSort_ds(ds2); //Troän DS1 vaø DS2 laïi thaønh Ds ñaõ co thöù töï Merge_ds(ds, ds1, ds2); } else Noi_2_ds(ds, ds1); }
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT //Phaân phoái DS vaøo DS1 Vaø DS2 voidDistribute_ds(List &ds,List &ds1, List &ds2) { NODE *p = PickHead(ds); Addtail(ds1, p); if (ds.pHead!=NULL) if (p->Info <= ds.pHead->Info) Distribute_ds(ds, ds1, ds2); else Distribute_ds(ds, ds2, ds1); }
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT voidMerge_ds(List& ds, List& ds1, List &ds2) { NODE *p; while ((ds1.pHead!=NULL) && (ds2.pHead!=NULL)) { if(ds1.pHead->Info <= ds2.pHead->Info) p = PickHead(ds1); else p = PickHead(ds2) Addtail(ds, p); } Noi_2_ds(ds, ds1); Noi_2_ds(ds, ds2); }
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT Thuaät toaùn Radix Sort Böôùc 1 : k = 0; // k cho bieát chöõ soá duøng ñeå phaân loaïi hieän haønh, k = 0: haøng ñôn vò, k = 1: haøng chuïc; … Böôùc 2 : B2.1 : Khôûi taïo caùc danh saùch (loâ) roãng B0, B1,…, B9; B2.2 : Trong khi l khaùc roãng thöïc hieän : p = pickHead ( LIST & l ); // trích phaàn töû ñaàu danh saùch Ñaët phaàn töû p vaøo cuoái loâ B[i ] vôùi i laø chöõ soá thöù k cuûa pInfo; Böôùc 3 : Noái B0, B1,…, B9 laïi thaønh L; Böôùc 4 : + k = k + 1; + Neáu k < m thì trôû laïi böôùc 2.// m laø soá chöõ soá lôùn nhaát cuûa caùc con soá
SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT Ví duï : Cho moät danh saùch vôùi noäi dung cuûa moãi phaàn töû laø caùc soá nguyeân laàn löôït laø: 13 66 3 9 41 Haõy saép xeáp laïi danh saùch theo thöù töï taêng daàn cuûa daõy soá nguyeân baèng thuaät toaùn RadixSort.
pHead pTail 13 66 3 9 41 pTail 0 pHead 0 B0 pTail 1 pHead 1 B1 pTail 2 pHead 2 B2 pTail 3 pHead 3 B3 pTail 4 pHead 4 B4 pTail 5 pHead 5 B5 pTail 6 pHead 6 B6 pTail 7 pHead 7 B7 pTail 8 pHead 8 B8 pTail 9 pHead 9 B9