1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARK GROZEN-SMITH: Hæ, ég er Mark Grozen-Smith, og þetta er Quicksort. 3 00:00:10,390 --> 00:00:13,520 Rétt eins og Innsetningarröðun og kúla raða, Quicksort er reiknirit fyrir 4 00:00:13,520 --> 00:00:15,720 flokkun lista eða fylki af hlutum. 5 00:00:15,720 --> 00:00:19,080 Fyrir einfaldleiki, við skulum gera ráð fyrir að þeir hlutirnir eru bara heiltölur, en 6 00:00:19,080 --> 00:00:22,060 vita að Quicksort virkar fyrir meira en bara tölur. 7 00:00:22,060 --> 00:00:24,720 QuickStart er dálítið flóknara en innsetning eða kúla, en það er 8 00:00:24,720 --> 00:00:27,560 Einnig mun skilvirkari í flestum tilfellum. 9 00:00:27,560 --> 00:00:28,150 Bíddu við. 10 00:00:28,150 --> 00:00:30,760 Gerði hann að segja bara "mest tilvikum, "ekki" allt "? 11 00:00:30,760 --> 00:00:31,710 Athyglisvert, nr. 12 00:00:31,710 --> 00:00:33,560 Ekki öll tilfelli eru þau sömu. 13 00:00:33,560 --> 00:00:36,650 Ekki hafa áhyggjur af þessu smáatriðum ef þú hef ekki séð Big O tákn enn, en 14 00:00:36,650 --> 00:00:39,730 Quicksort er O (n í öðru veldi) reiknirit í versta falli, rétt eins og 15 00:00:39,730 --> 00:00:41,430 innsetning eða kúla tegund. 16 00:00:41,430 --> 00:00:44,950 Hins vegar virkar það yfirleitt mikið meira eins og gamlan flaumi m reiknirit. 17 00:00:44,950 --> 00:00:45,750 Hvers vegna? 18 00:00:45,750 --> 00:00:46,810 Við munum fá til baka til það síðar. 19 00:00:46,810 --> 00:00:49,610 En nú, við skulum bara læra hvernig Quicksort virkar. 20 00:00:49,610 --> 00:00:53,080 >> Svo skulum ganga í gegnum Quicksorting þetta array heiltalna frá minnstu 21 00:00:53,080 --> 00:00:54,260 til stærsta. 22 00:00:54,260 --> 00:01:00,110 Hér höfum við heiltölur 6, 5, 1, 3, 8, 4, 7, 9, og 2. 23 00:01:00,110 --> 00:01:03,480 First, velja okkur Lokaþáttur þetta array - í þessu tilfelli, tveir - 24 00:01:03,480 --> 00:01:06,870 og kalla að "pivot." Næst, við byrja að líta á tvo hluti - 25 00:01:06,870 --> 00:01:10,220 einn, lægsta vísitölu, sem ég mun vísa til sem dvelja til hægri 26 00:01:10,220 --> 00:01:13,970 vegg, og, tveir, að leftmost þáttur, sem ég mun kalla "núverandi 27 00:01:13,970 --> 00:01:17,260 þáttur. "Það sem við erum að fara að gera er að líta alla aðra þætti, önnur 28 00:01:17,260 --> 00:01:20,930 en völtur, og setja alla þætti minni en snúist í 29 00:01:20,930 --> 00:01:24,140 til vinstri á veggnum og allir þeir stærri en snúist í 30 00:01:24,140 --> 00:01:25,570 hægri á vegg. 31 00:01:25,570 --> 00:01:29,560 Þá loks munum við falla pivot rétt á þessi veggur til að setja það á milli 32 00:01:29,560 --> 00:01:32,970 allar tölur minni en það og allar tölur stærri. 33 00:01:32,970 --> 00:01:34,460 >> Svo skulum gera það. 34 00:01:34,460 --> 00:01:38,540 Taka upp 2, setti vegg á farin og hringdu í 6 "núverandi 35 00:01:38,540 --> 00:01:41,590 þáttur. "Þannig að við viljum líta á Núverandi þáttur okkar, 6. 36 00:01:41,590 --> 00:01:44,200 Og þar sem það er stærri en 2, láta við það þar til 37 00:01:44,200 --> 00:01:45,610 hægri á vegg. 38 00:01:45,610 --> 00:01:48,980 Þá færa okkur á að líta á 5 eins og okkar Núverandi þáttur og sjá að þetta 39 00:01:48,980 --> 00:01:51,840 er, aftur, stærri en snúningspinnann, þannig að við leyfi það þar sem það er á hægri 40 00:01:51,840 --> 00:01:53,190 megin við vegginn. 41 00:01:53,190 --> 00:01:53,880 Við fara. 42 00:01:53,880 --> 00:01:56,750 Núverandi þáttur okkar er nú 1 og - ó. 43 00:01:56,750 --> 00:01:58,030 Þetta er nú öðruvísi. 44 00:01:58,030 --> 00:02:00,890 Núverandi þátturinn er nú minni en völtur, þannig að við viljum setja það 45 00:02:00,890 --> 00:02:02,570 vinstra megin við vegginn. 46 00:02:02,570 --> 00:02:06,555 Til að gera þetta, við skulum skipta bara Núverandi þáttur með lægsta vísitölu 47 00:02:06,555 --> 00:02:07,970 situr bara til hægri vegg. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 Nú, færa okkur vegginn upp einni vísitölu svo er 1 til vinstri 50 00:02:17,570 --> 00:02:19,750 megin við vegginn núna. 51 00:02:19,750 --> 00:02:20,310 >> Bíddu. 52 00:02:20,310 --> 00:02:23,450 Ég blanda bara upp hluti á hægri hlið vegg, gerði ég ekki? 53 00:02:23,450 --> 00:02:23,890 Ekki hafa áhyggjur. 54 00:02:23,890 --> 00:02:24,930 Það er allt í lagi. 55 00:02:24,930 --> 00:02:27,570 Það eina sem okkur er annt um að nú er að öll þessi atriði til að 56 00:02:27,570 --> 00:02:29,570 til hægri á vegg eru stærri en völtur. 57 00:02:29,570 --> 00:02:31,760 Enginn raunverulegur röð er enn gert ráð fyrir. 58 00:02:31,760 --> 00:02:33,200 >> Nú, aftur að flokka. 59 00:02:33,200 --> 00:02:35,840 Svo við höldum áfram á að horfa á restin af þeim þáttum. 60 00:02:35,840 --> 00:02:39,075 Og í þessu tilfelli, má sjá að það eru Engar aðrir þættir minna en 61 00:02:39,075 --> 00:02:42,100 völtur, svo við leggjum þau öll á hægra megin á veggnum. 62 00:02:42,100 --> 00:02:45,980 Loks fáum við að núverandi frumefni og sjá að það er völtur. 63 00:02:45,980 --> 00:02:48,830 Nú, það þýðir að við höfum tvo kafla í fylkinu, Fyrsta vera 64 00:02:48,830 --> 00:02:51,820 lítið á völtur og á vinstri hlið á veggnum, og annað sem 65 00:02:51,820 --> 00:02:54,500 stærri en snúist í hægri megin við vegginn. 66 00:02:54,500 --> 00:02:57,040 Við viljum setja völtur þáttur milli tveir, og þá munum við vita 67 00:02:57,040 --> 00:03:01,000 skagar er í rétti sínum Endanleg raðað staður. 68 00:03:01,000 --> 00:03:04,980 Þannig að við skipta fyrsta atriði á hægra megin á vegg með Pivot, 69 00:03:04,980 --> 00:03:06,410 og við vitum völtur er í rétta stöðu. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> Við endurtaka þá er þetta ferli til að vinna subarrays vinstri og hægri á völtur. 72 00:03:15,650 --> 00:03:18,700 Frá því að síðasta subarray er aðeins eitt þáttur lengi, við vitum að er nú þegar 73 00:03:18,700 --> 00:03:22,480 Raðað því hvernig er hægt að vera út af panta ef þú ert aðeins einn þáttur? 74 00:03:22,480 --> 00:03:28,860 Fyrir hægri hlið subarray, við sjá skagar er 5, og vegg 75 00:03:28,860 --> 00:03:32,250 er bara eftir af 6. 76 00:03:32,250 --> 00:03:34,970 Og núverandi þáttur líka byrjar út eins og 6. 77 00:03:34,970 --> 00:03:36,200 Svo er 6 meiri en 5. 78 00:03:36,200 --> 00:03:38,590 Við leggjum það þar sem það er á hægri megin við vegginn. 79 00:03:38,590 --> 00:03:41,060 Nú, að færa á, 3 er minna en 5. 80 00:03:41,060 --> 00:03:44,160 Þannig að við að skipta um það með fyrsta frumefni bara rétt á veggnum. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 Nú flutti ég vegginn upp einn. 83 00:03:50,750 --> 00:03:53,010 Nú, flutti í 8. 84 00:03:53,010 --> 00:03:56,480 8 er meiri en 5, og svo við leggjum það. 85 00:03:56,480 --> 00:03:58,720 The 4 er minna en 5, þannig að við að skipta á það. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 Og á. 88 00:04:03,570 --> 00:04:04,820 Og á. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> Hvert skipti sem við endurtökum ferlið á vinstri og hægri hliðar í fylkinu. við 91 00:04:13,670 --> 00:04:17,010 velja pivot og gera samanburð og búa til annan stigi til vinstri og 92 00:04:17,010 --> 00:04:18,240 rétt subarrays. 93 00:04:18,240 --> 00:04:21,500 Þetta endurkvæma hringja mun halda áfram þar til við náum að enda þegar við höfum 94 00:04:21,500 --> 00:04:25,290 skipt upp í heild array inn bara subarrays af lengd 1. 95 00:04:25,290 --> 00:04:28,060 Þaðan vitum við array er raðað því hver þáttur hefur á 96 00:04:28,060 --> 00:04:29,330 einhverjum tímapunkti, verið völtur. 97 00:04:29,330 --> 00:04:32,720 Með öðrum orðum, fyrir sérhver þáttur, allir Tölurnar til vinstri eru minni 98 00:04:32,720 --> 00:04:36,420 gildi og allar tölur til að rétt hafa meiri gildum. 99 00:04:36,420 --> 00:04:38,980 >> Þessi aðferð virkar mjög vel ef gildi snúningspinnann valið er 100 00:04:38,980 --> 00:04:41,930 um það bil í miðjunni svið af listanum gildum. 101 00:04:41,930 --> 00:04:45,630 Þetta myndi þýða að eftir að við færa þættir í kring, þar um eins og margir 102 00:04:45,630 --> 00:04:48,390 þættir til vinstri á völtur eins og það eru til hægri. 103 00:04:48,390 --> 00:04:52,380 Og skipta-og-sigra eðli af Quicksort algrím er síðan leyst 104 00:04:52,380 --> 00:04:53,850 fullur kostur af. 105 00:04:53,850 --> 00:04:57,500 Þetta skapar Runtime af O (n log n,) n vegna þess að við verðum að gera n mínus 1 106 00:04:57,500 --> 00:05:01,640 samanburð á hverri kynslóð og tengja n vegna þess að við verðum að skipta lista 107 00:05:01,640 --> 00:05:03,210 log n sinnum. 108 00:05:03,210 --> 00:05:06,160 Hins vegar, í versta tilfelli, þetta Reiknirit geta raunverulega vera O (n 109 00:05:06,160 --> 00:05:09,850 ferningur.) Segjum á hverri kynslóð, völtur gerist bara svo að vera 110 00:05:09,850 --> 00:05:12,520 minnstu eða stærsta af tölur sem við erum að flokka. 111 00:05:12,520 --> 00:05:15,870 Þetta myndi þýða að brjóta niður listann N sinnum og gerð n mínus 1 112 00:05:15,870 --> 00:05:17,690 samanburður hvert eitt sinn. 113 00:05:17,690 --> 00:05:20,490 Þannig, o af n í öðru veldi. 114 00:05:20,490 --> 00:05:22,000 >> Hvernig getum við bætt aðferð? 115 00:05:22,000 --> 00:05:25,100 Ein leið til að bæta aðferð er að skera niður á líkum á að 116 00:05:25,100 --> 00:05:28,150 The Runtime er alltaf í raun o af n í öðru veldi. 117 00:05:28,150 --> 00:05:31,860 Muna þetta versta versta falli getur aðeins gerst þegar 118 00:05:31,860 --> 00:05:35,320 völtur valið er alltaf hæsta eða lægsta gildi í array. 119 00:05:35,320 --> 00:05:38,630 Til að tryggja þetta er minna líklegur til að gerast, við getum fundið ás með 120 00:05:38,630 --> 00:05:42,610 velja marga þætti og taka miðgildi. 121 00:05:42,610 --> 00:05:44,650 >> Mitt nafn er Mark Grozen-Smith, og þetta er CS50. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> Fyrir einfaldleiki, við skulum gera ráð fyrir að þeir hlutirnir eru bara heiltölur, en 124 00:05:50,930 --> 00:05:51,970 vita að 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 >> Hér höfum við heiltölur 6, 5, 1, 3, 8, 4, 9. 128 00:06:02,000 --> 00:06:03,200 >> Ræðumaður 1: Really? 129 00:06:03,200 --> 00:06:04,850 >> Ræðumaður 2: Ekki hætta þar. 130 00:06:04,850 --> 00:06:06,100 >> Ræðumaður 1: Really? 131 00:06:06,100 --> 00:06:08,491