1 / 68

SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT

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.

silvio
Download Presentation

SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. SAÉP XEÁP THÖÙ TÖÏ TREÂN DANH SAÙCH LIEÂN KEÁT

  2. 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

  3. 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.

  4. 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

  5. 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!

  6. THUAÄT TOAÙN CHOÏN TRÖÏC TIEÁP TREÂN XAÂU

  7. THAO TAÙC TREÂN VUØNG INFO void ListSelectionSort (LIST &l) { NODE *min; NODE *p, *q; p = l.pHead; while ( p != pTail ) { q = ppNext; min = p; while ( q != NULL ) { if ( qInfo < minInfo ) min = q; q = qpNext; } Hoanvi ( minInfo, pInfo); p = ppNext; } }

  8. 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ù.

  9. 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õ;

  10. THAO TAÙC TREÂN VUØNG NEXT Ví duï : min pTail 1 pHead 1 13 3 9 7 16 pHead2 pTail2 pTail2

  11. 13 THAO TAÙC TREÂN VUØNG NEXT min pTail 1 pHead 1 9 7 16 pHead2 3 pTail2 pTail2

  12. THAO TAÙC TREÂN VUØNG NEXT min pTail 1 pHead 1 13 9 16 pHead2 3 7 pTail2 pTail2

  13. THAO TAÙC TREÂN VUØNG NEXT min pTail 1 pHead 1 13 16 pHead2 3 7 9 pTail2 pTail2

  14. THAO TAÙC TREÂN VUØNG NEXT min pTail 1 pTail 1 pHead 1 16 pHead2 3 7 9 13 pTail2 pTail2

  15. THAO TAÙC TREÂN VUØNG NEXT pTail 1 pHead 1 pTail2 pHead2 3 7 9 13 16

  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 = ppNext; min = p; minprev = NULL; while (q != NULL) { if (qInfo < minInfo) { min = q; minprev = p;//chæ phaàn töû ñöùng tröôùc min trong xaâu } p = q; q = qpNext; } return minprev; }

  17. 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; }

  18. THUAÄT TOAÙN QUICK SORT

  19. 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.

  20. 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

  21. 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

  22. X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds

  23. X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds

  24. X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds

  25. X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds

  26. X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds

  27. X 2 9 4 1 5 3 pHead ds2 ds1 Taùch danh saùch hieän haønh thaønh 2 ds

  28. X 3 9 4 5 1 2 Vaäy ta ñöôïc DS1 vaø DS2 nhö sau pHead ds2 ds1

  29. X 9 5 4 2 1 3 Saép xeáp DS1 vaø DS2 theo Quick sort pHead ds1 ds2

  30. 9 5 4 3 2 1 Noái Ds1 – X – Ds2 vaø ñöa keát quaû vaøo pHead pHead

  31. 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ù.

  32. 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; }

  33. 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); }

  34. 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); }

  35. THUAÄT TOAÙN MERGE SORT

  36. 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.

  37. 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

  38. pHead pHead 4 2 9 1 2 5 5 3 9 1 4 3 pHead Ds1 Ds2

  39. pHead pHead pHead 5 3 5 3 9 1 9 1 Saép xeáp Ds1 theo Merge sort Ds1 Ds1.1 Ds1.2

  40. 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

  41. 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

  42. 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ø.

  43. 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); }

  44. 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); }

  45. 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); }

  46. THUAÄT TOAÙN RADIXSORT

  47. 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 pInfo; 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á

  48. 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.

  49. 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

  50. Phaân loaïi theo haøng ñôn vò

More Related