1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARK GROZEN-Smith: Hi, Ako Mark Grozen-Smith, at ito ay Quicksort. 3 00:00:10,390 --> 00:00:13,520 Tulad lamang ng uri pagpapasok at bubble -uri-uriin, Quicksort ay isang algorithm para sa 4 00:00:13,520 --> 00:00:15,720 sa pag-aayos ng isang listahan o isang hanay ng mga bagay. 5 00:00:15,720 --> 00:00:19,080 Para sa pagiging simple, Ipagpalagay nating hayaan na ang mga bagay lamang integer, ngunit 6 00:00:19,080 --> 00:00:22,060 alam na Quicksort gumagana para sa higit pa sa mga numero. 7 00:00:22,060 --> 00:00:24,720 Quickstart ay isang bit mas komplikado kaysa bubble pagpapasok o, subalit ito ay 8 00:00:24,720 --> 00:00:27,560 magkano din sa mas mahusay na sa karamihan ng mga kaso. 9 00:00:27,560 --> 00:00:28,150 Maghintay ng isang segundo. 10 00:00:28,150 --> 00:00:30,760 Ang ibig sabihin siya lang ang "pinaka- kaso, "hindi" lahat "? 11 00:00:30,760 --> 00:00:31,710 Nang kawili-wili, hindi. 12 00:00:31,710 --> 00:00:33,560 Hindi lahat ng mga kaso ay pareho. 13 00:00:33,560 --> 00:00:36,650 Huwag mag-alala tungkol sa detalye na ito kung ikaw hindi pa nakita malaki pagtatanda Oh, ngunit 14 00:00:36,650 --> 00:00:39,730 Quicksort ay isang O (n nakalapat) algorithm sa pinakamalala, tulad lamang ng 15 00:00:39,730 --> 00:00:41,430 bubble-uri-uriin ang pagpapasok o. 16 00:00:41,430 --> 00:00:44,950 Gayunpaman, ito ay karaniwang gumaganap marami pang iba tulad ng isang lumang analog m algorithm. 17 00:00:44,950 --> 00:00:45,750 Bakit? 18 00:00:45,750 --> 00:00:46,810 Babalikan ka namin sa na mamaya. 19 00:00:46,810 --> 00:00:49,610 Ngunit para sa ngayon, matuto ni lamang ipaalam kung paano gumagana ang Quicksort. 20 00:00:49,610 --> 00:00:53,080 >> Kaya sabihin maglakad sa pamamagitan Quicksorting ito array ng integer mula sa pinakamaliliit 21 00:00:53,080 --> 00:00:54,260 sa pinakamalaking. 22 00:00:54,260 --> 00:01:00,110 Narito mayroon namin ang integer 6, 5, 1, 3, 8, 4, 7, 9, at 2. 23 00:01:00,110 --> 00:01:03,480 Una, pumili namin ang pangwakas na elemento ng ito array - sa kasong ito, dalawang - 24 00:01:03,480 --> 00:01:06,870 at tawagan na ang "pivot." Susunod, namin simulan upang tumingin sa dalawang bagay - 25 00:01:06,870 --> 00:01:10,220 isa, ang pinakamababang index, na kung saan kukunin ko na sumangguni sa bilang naglalagi sa kanan ng 26 00:01:10,220 --> 00:01:13,970 sa pader, at, dalawang, ang pinakakaliwa elemento, na Tatawag ako ng "kasalukuyang 27 00:01:13,970 --> 00:01:17,260 elemento. "Ano kami ay pagpunta sa gawin ay tingnan ang lahat ng iba pang mga elemento, iba pang 28 00:01:17,260 --> 00:01:20,930 kaysa sa mga pivot, at ilagay ang lahat ng mga elemento mas maliit kaysa sa mga pivot sa 29 00:01:20,930 --> 00:01:24,140 iniwan ng mga pader at ang lahat ng mga mas malaki kaysa sa mga pivot sa 30 00:01:24,140 --> 00:01:25,570 kanan ng pader. 31 00:01:25,570 --> 00:01:29,560 Pagkatapos, sa wakas, makikita namin i-drop ang mga pivot karapatan sa na pader upang ilagay ito sa pagitan ng 32 00:01:29,560 --> 00:01:32,970 ang lahat ng mga numero na mas maliit kaysa ito at ang lahat ng mga numero ng mas malaki. 33 00:01:32,970 --> 00:01:34,460 >> Kaya sabihin gawin iyon. 34 00:01:34,460 --> 00:01:38,540 Pumili ng hanggang sa 2, ilagay ang pader sa simula, at tawagan ang 6 na ang "kasalukuyang 35 00:01:38,540 --> 00:01:41,590 elemento. "Kaya gusto namin upang tumingin sa aming kasalukuyang elemento, ang 6. 36 00:01:41,590 --> 00:01:44,200 At dahil ito ay mas malaki kaysa sa 2, mag-iwan namin ito doon sa 37 00:01:44,200 --> 00:01:45,610 kanan ng pader. 38 00:01:45,610 --> 00:01:48,980 Pagkatapos, ilipat namin sa upang tumingin sa ang 5 bilang aming kasalukuyang elemento at makita na ito 39 00:01:48,980 --> 00:01:51,840 ay, muli, mas malaki kaysa sa pivot, kaya kami iwanan ito kung saan ito ay sa kanan 40 00:01:51,840 --> 00:01:53,190 gilid ng pader. 41 00:01:53,190 --> 00:01:53,880 Kami umusad. 42 00:01:53,880 --> 00:01:56,750 Ang aming kasalukuyang mga elemento ay ngayon 1, at - oh. 43 00:01:56,750 --> 00:01:58,030 Ito ay iba ngayon. 44 00:01:58,030 --> 00:02:00,890 Ang kasalukuyang elemento na ngayon na mas maliit sa ang pivot, kaya nais naming ilagay ito 45 00:02:00,890 --> 00:02:02,570 sa kaliwa ng pader. 46 00:02:02,570 --> 00:02:06,555 Upang gawin ito, lumipat na lamang hayaan ang kasalukuyang elemento na may pinakamababang index 47 00:02:06,555 --> 00:02:07,970 pag-upo lamang sa kanan ng pader. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 Ngayon, ilipat namin ang mga pader up ng isa index kaya ang 1 ay sa kaliwa 50 00:02:17,570 --> 00:02:19,750 gilid ng pader ngayon. 51 00:02:19,750 --> 00:02:20,310 >> Maghintay. 52 00:02:20,310 --> 00:02:23,450 Lamang halo-halong ko up ang mga elemento sa kanang bahagi ng pader, ginawang hindi ko? 53 00:02:23,450 --> 00:02:23,890 Huwag mag-alala. 54 00:02:23,890 --> 00:02:24,930 Iyon ay pinong. 55 00:02:24,930 --> 00:02:27,570 Ang tanging bagay na mahalaga kami tungkol sa para sa ngayon ay na ang lahat ng mga sangkap na ito sa 56 00:02:27,570 --> 00:02:29,570 kanan ng pader ay mas malaki kaysa sa mga pivot. 57 00:02:29,570 --> 00:02:31,760 Walang aktwal na order pa ipinapalagay. 58 00:02:31,760 --> 00:02:33,200 >> Ngayon, bumalik sa pag-uuri. 59 00:02:33,200 --> 00:02:35,840 Kaya patuloy kami sa pagtingin sa ang natitirang bahagi ng mga elemento. 60 00:02:35,840 --> 00:02:39,075 At sa kasong ito, nakita namin na may mga walang iba pang mga elemento ng mas mababa kaysa sa 61 00:02:39,075 --> 00:02:42,100 ng pivot, kaya mag-iwan namin ang mga ito lahat sa ang kanang bahagi ng pader. 62 00:02:42,100 --> 00:02:45,980 Sa wakas, makakakuha tayo sa kasalukuyang elemento at makita na ito ay ang mga pivot. 63 00:02:45,980 --> 00:02:48,830 Ngayon, na nangangahulugan na mayroon kaming dalawang mga seksyon ng array, ang unang pagkatao 64 00:02:48,830 --> 00:02:51,820 maliit sa pivot at sa kaliwang bahagi ng mga pader, at ang pangalawang pagkatao 65 00:02:51,820 --> 00:02:54,500 mas malaki kaysa sa mga pivot sa kanang bahagi ng pader. 66 00:02:54,500 --> 00:02:57,040 Gusto naming ilagay ang elemento ng mga pivot sa pagitan ng ang dalawang, at pagkatapos ay gagamitin namin alam 67 00:02:57,040 --> 00:03:01,000 na ang mga pivot ay nasa kanan nito huling pinagsunod-sunod lugar. 68 00:03:01,000 --> 00:03:04,980 Kaya lumipat kami sa unang elemento sa kanang bahagi ng pader na may mga pivot, 69 00:03:04,980 --> 00:03:06,410 at alam namin ang mga pivot ng sa sarili karapatan posisyon. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> Pagkatapos ay ulitin namin ang prosesong ito para sa subarrays sa kaliwa at kanan ng pivot. 72 00:03:15,650 --> 00:03:18,700 Mula noong huling subarray ay isa lamang elemento mahaba, alam namin na mayroon 73 00:03:18,700 --> 00:03:22,480 Uri-uriin dahil kung paano mo maaaring maging out sa umorder kung ikaw ay lamang ng isang elemento? 74 00:03:22,480 --> 00:03:28,860 Para sa kanang bahagi ng subarray, namin makita na ang mga pivot ay 5, at sa pader 75 00:03:28,860 --> 00:03:32,250 ay iniwan lamang ng 6. 76 00:03:32,250 --> 00:03:34,970 At sa kasalukuyang elemento rin nagsisimula out bilang 6. 77 00:03:34,970 --> 00:03:36,200 Kaya 6 ay mas malaki kaysa 5. 78 00:03:36,200 --> 00:03:38,590 Iwanan namin ito kung saan ito ay nasa kanang bahagi ng pader. 79 00:03:38,590 --> 00:03:41,060 Ngayon, gumagalaw sa, 3 ay mas mababa sa 5. 80 00:03:41,060 --> 00:03:44,160 Kaya lumipat kami nito sa unang elemento karapatan lamang ng mga pader. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 Ngayon, lumipat ako sa pader up ng isa. 83 00:03:50,750 --> 00:03:53,010 Ngayon, gumagalaw sa sa 8. 84 00:03:53,010 --> 00:03:56,480 8 ay mas malaki kaysa 5, at kaya iwanan namin ito. 85 00:03:56,480 --> 00:03:58,720 Ang 4 Mas mababa sa 5, kaya lumipat namin ito. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 At sa. 88 00:04:03,570 --> 00:04:04,820 At sa. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> Sa bawat oras na ulitin namin ang proseso sa kaliwa at kanang panig ng array. kami 91 00:04:13,670 --> 00:04:17,010 pumili ng isang pivot at gawin ang mga paghahambing at lumikha ng isa pang antas ng kaliwa at 92 00:04:17,010 --> 00:04:18,240 karapatan subarrays. 93 00:04:18,240 --> 00:04:21,500 Ito recursive tawag ay magpapatuloy hanggang sa maabot namin ang katapusan kapag hindi namin 94 00:04:21,500 --> 00:04:25,290 hinati up ang pangkalahatang array sa lamang subarrays ng haba 1. 95 00:04:25,290 --> 00:04:28,060 Mula doon, alam namin ang array ay pinagsunod-sunod dahil ang bawat elemento ay may, sa 96 00:04:28,060 --> 00:04:29,330 ilang mga punto, naging isang pivot. 97 00:04:29,330 --> 00:04:32,720 Sa ibang salita, para sa bawat elemento, lahat ang mga numero sa bandang kaliwa ay higit na maliit 98 00:04:32,720 --> 00:04:36,420 mga halaga at ang lahat ng mga numero sa karapatang magkaroon ng mas malawak na mga halaga. 99 00:04:36,420 --> 00:04:38,980 >> Pamamaraan na ito ay gumagana nang napakahusay kung ang halaga ng mga pivot pinili ay 100 00:04:38,980 --> 00:04:41,930 humigit-kumulang sa gitna hanay ng mga halaga ng listahan. 101 00:04:41,930 --> 00:04:45,630 Ito ay nangangahulugan na, pagkatapos naming ilipat mga elemento sa paligid, may tungkol sa bilang marami 102 00:04:45,630 --> 00:04:48,390 mga elemento sa kaliwa ng mga pivot bilang mayroong sa kanan. 103 00:04:48,390 --> 00:04:52,380 At ang paghati-hatiin-at-malupig likas na katangian ng Quicksort algorithm ay pagkatapos ay dadalhin 104 00:04:52,380 --> 00:04:53,850 nang husto. 105 00:04:53,850 --> 00:04:57,500 Lumilikha ito ng isang runtime sa mga O (n log n,) ang n dahil mayroon kaming gawin n minus 1 106 00:04:57,500 --> 00:05:01,640 mga paghahambing sa bawat henerasyon at ng log n dahil mayroon kaming upang hatiin ang listahan 107 00:05:01,640 --> 00:05:03,210 mag-log n ulit. 108 00:05:03,210 --> 00:05:06,160 Gayunpaman, sa pinakamasamang sitwasyon, ito algorithm ay maaaring talagang maging O (n 109 00:05:06,160 --> 00:05:09,850 nakalapat.) Ipagpalagay na sa bawat henerasyon, ang pivot kaya lang ang mangyayari sa maging ang 110 00:05:09,850 --> 00:05:12,520 pinakamaliit o ang pinakamalaking ng mga numero na aming pag-uuri. 111 00:05:12,520 --> 00:05:15,870 Ang magiging ibig sabihin nito na pinaghihiwa-hiwalay ang listahan n ang mga oras at paggawa n minus 1 112 00:05:15,870 --> 00:05:17,690 paghahambing bawat solong oras. 113 00:05:17,690 --> 00:05:20,490 Kaya, o ng n nakalapat. 114 00:05:20,490 --> 00:05:22,000 >> Paano namin maaaring mapabuti ang paraan? 115 00:05:22,000 --> 00:05:25,100 Isang mahusay na paraan upang mapabuti ang paraan ay upang i-cut down na sa posibilidad na 116 00:05:25,100 --> 00:05:28,150 ang runtime ay kailanman tunay o ng n nakalapat. 117 00:05:28,150 --> 00:05:31,860 Tandaan ang pinakapangit, pinakamasama sitwasyon kaso Maaari lamang itong mangyari kapag ang 118 00:05:31,860 --> 00:05:35,320 pivot pinili ay palaging ng pinakamataas na o pinakamababang halaga sa array. 119 00:05:35,320 --> 00:05:38,630 Upang matiyak na ito ay hindi malamang na mangyari, maaari naming mahanap ang mga pivot sa pamamagitan ng 120 00:05:38,630 --> 00:05:42,610 pagpili ng maramihang mga elemento at paglalaan ng panggitna halaga. 121 00:05:42,610 --> 00:05:44,650 >> Ang pangalan ko ay Mark Grozen-Smith, at ito ay CS50. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> Para sa pagiging simple, Ipagpalagay nating hayaan na ang mga bagay lamang integer, ngunit 124 00:05:50,930 --> 00:05:51,970 alam na Quicksert - 125 00:05:51,970 --> 00:05:53,160 Quicksert? 126 00:05:53,160 --> 00:05:55,200 Sorry. 127 00:05:55,200 --> 00:06:02,000 >> Narito mayroon namin ang integer 6, 5, 1, 3, 8, 4, 9. 128 00:06:02,000 --> 00:06:03,200 >> Tagapagsalita 1: Talagang? 129 00:06:03,200 --> 00:06:04,850 >> Tagapagsalita 2: Huwag itigil doon. 130 00:06:04,850 --> 00:06:06,100 >> Tagapagsalita 1: Talagang? 131 00:06:06,100 --> 00:06:08,491