1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARK GROZEN-SMITH: Bok, ja sam Marko Grozen-Smith, a to je Quicksort. 3 00:00:10,390 --> 00:00:13,520 Baš kao što je umetanje vrste i mjehur sortiranje, Quicksort je algoritam za 4 00:00:13,520 --> 00:00:15,720 sortiranje popisa ili niz stvari. 5 00:00:15,720 --> 00:00:19,080 Za jednostavnost, pretpostavimo da su oni stvari su samo cijeli brojevi, ali 6 00:00:19,080 --> 00:00:22,060 Znam da Quicksort radi za više nego samo brojevima. 7 00:00:22,060 --> 00:00:24,720 Quickstart je malo složeniji od umetanja ili mjehurića, ali to je 8 00:00:24,720 --> 00:00:27,560 također mnogo učinkovitiji u većini slučajeva. 9 00:00:27,560 --> 00:00:28,150 Čekaj malo. 10 00:00:28,150 --> 00:00:30,760 Je li samo reći "većina slučajevi ", a ne" sve "? 11 00:00:30,760 --> 00:00:31,710 Zanimljivo, br. 12 00:00:31,710 --> 00:00:33,560 Nisu svi slučajevi su isti. 13 00:00:33,560 --> 00:00:36,650 Ne brinite o ovom detalju, ako vam nisu vidjeli veliki O zapis, no 14 00:00:36,650 --> 00:00:39,730 Quicksort je O (n na kvadrat) algoritam u najgorem slučaju, baš kao i 15 00:00:39,730 --> 00:00:41,430 umetanja ili mjehurić vrsta. 16 00:00:41,430 --> 00:00:44,950 Međutim, to obično djeluje mnogo više kao stari analogni m algoritma. 17 00:00:44,950 --> 00:00:45,750 Zašto? 18 00:00:45,750 --> 00:00:46,810 Vratit ćemo se na to kasnije. 19 00:00:46,810 --> 00:00:49,610 No, za sada, idemo samo naučiti Kako Quicksort radi. 20 00:00:49,610 --> 00:00:53,080 >> Tako ćemo šetati Quicksorting to niz brojeva od najmanjeg 21 00:00:53,080 --> 00:00:54,260 do najvećih. 22 00:00:54,260 --> 00:01:00,110 Ovdje imamo cijeli brojevi 6, 5, 1, 3, 8, 4, 7, 9, i 2. 23 00:01:00,110 --> 00:01:03,480 Prvo, mi pokupiti konačni element ovo polje - u ovom slučaju, dva - 24 00:01:03,480 --> 00:01:06,870 i poziv da se "stožer." Zatim smo početi gledati na dvije stvari - 25 00:01:06,870 --> 00:01:10,220 jedan, najniži indeks, koji ću uputiti kao boraveći s desne strane 26 00:01:10,220 --> 00:01:13,970 zid, i, dva, lijevom element, koji ću nazvati "struje 27 00:01:13,970 --> 00:01:17,260 elementa. "Ono što ćemo učiniti je izgleda sve druge elemente, druge 28 00:01:17,260 --> 00:01:20,930 od pivota, i staviti sve elemente manji od pivota na 29 00:01:20,930 --> 00:01:24,140 lijevo od zida i sve one veći od pivota na 30 00:01:24,140 --> 00:01:25,570 Pravo na zidu. 31 00:01:25,570 --> 00:01:29,560 Zatim, konačno, mi ćemo pasti stožer Pravo na tom zidu bi ga staviti između 32 00:01:29,560 --> 00:01:32,970 svi brojevi manji od njega i sve veći broj. 33 00:01:32,970 --> 00:01:34,460 >> Tako ćemo učiniti. 34 00:01:34,460 --> 00:01:38,540 Podigni 2, staviti na zid na početku, i pozvati 6 "Current 35 00:01:38,540 --> 00:01:41,590 elementa. "Na taj način želimo pogledati Naš trenutni element 6. 36 00:01:41,590 --> 00:01:44,200 A budući da je veći od 2, mi ga ostaviti tamo 37 00:01:44,200 --> 00:01:45,610 Pravo na zidu. 38 00:01:45,610 --> 00:01:48,980 Zatim smo prešli na pogledati na 5 kao naš trenutni element i vidjeti da je to 39 00:01:48,980 --> 00:01:51,840 je, opet, veći od zgloba, tako da se ostavite ga gdje se nalazi na desnoj strani 40 00:01:51,840 --> 00:01:53,190 strane zida. 41 00:01:53,190 --> 00:01:53,880 Mi smo krenuti dalje. 42 00:01:53,880 --> 00:01:56,750 Naš trenutni element sad 1, i - oh. 43 00:01:56,750 --> 00:01:58,030 Ovo je sada drugačija. 44 00:01:58,030 --> 00:02:00,890 Trenutna element je sada manja od pivot, pa želimo da se stavi 45 00:02:00,890 --> 00:02:02,570 s lijeve strane zida. 46 00:02:02,570 --> 00:02:06,555 Da biste to učinili, neka je samo prebaciti Trenutna element s najmanjim indeksom 47 00:02:06,555 --> 00:02:07,970 sjedi samo na desnoj strani zida. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 Sada smo premjestiti zid do jedne indeksa do 1 je na lijevoj 50 00:02:17,570 --> 00:02:19,750 strani zidu. 51 00:02:19,750 --> 00:02:20,310 >> Čekaj. 52 00:02:20,310 --> 00:02:23,450 Samo sam umiješan i elemente za desnoj strani zida, zar ne? 53 00:02:23,450 --> 00:02:23,890 Ne brinite. 54 00:02:23,890 --> 00:02:24,930 To je u redu. 55 00:02:24,930 --> 00:02:27,570 Jedino što mi je stalo, za sada je da su svi ti elementi 56 00:02:27,570 --> 00:02:29,570 Pravo na zidu su veće od pivota. 57 00:02:29,570 --> 00:02:31,760 No stvarni poredak pretpostavlja još. 58 00:02:31,760 --> 00:02:33,200 >> Sada, natrag na sortiranje. 59 00:02:33,200 --> 00:02:35,840 Dakle, mi i dalje gleda na Ostatak elemenata. 60 00:02:35,840 --> 00:02:39,075 I u ovom slučaju, vidimo da postoje nema druge elemente manje od 61 00:02:39,075 --> 00:02:42,100 pivot, tako da smo ih sve ostaviti na desna strana zida. 62 00:02:42,100 --> 00:02:45,980 Konačno, možemo doći do trenutnog elementa i vidjeti da je pivot. 63 00:02:45,980 --> 00:02:48,830 Sada, to znači da imamo dva dijelovi polja, prvi je bio 64 00:02:48,830 --> 00:02:51,820 Mali na pivota, a na lijevoj strani zida, a drugom biću 65 00:02:51,820 --> 00:02:54,500 veći od pivota na desnoj strani zida. 66 00:02:54,500 --> 00:02:57,040 Mi želimo staviti pivot element između dva, a onda ćemo znati 67 00:02:57,040 --> 00:03:01,000 da Zglob je u pravu Konačna sortirani mjesto. 68 00:03:01,000 --> 00:03:04,980 Tako smo prebacili prvi element na desna strana zida sa osovinom, 69 00:03:04,980 --> 00:03:06,410 a znamo pivot-a u pravilnom položaju. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> Zatim smo ponoviti ovaj postupak za subarrays lijevo i desno od pivota. 72 00:03:15,650 --> 00:03:18,700 Od zadnjeg subarray je samo jedan Element dugo, znamo da je već 73 00:03:18,700 --> 00:03:22,480 sortirani jer kako možete biti izvan naručiti ako ste samo jedan element? 74 00:03:22,480 --> 00:03:28,860 Na desnoj strani subarray smo vidim da je pivot je 5, a zid 75 00:03:28,860 --> 00:03:32,250 je samo ostalo od šest. 76 00:03:32,250 --> 00:03:34,970 I trenutni element počinje kao 6. 77 00:03:34,970 --> 00:03:36,200 6. tako je veća od 5. 78 00:03:36,200 --> 00:03:38,590 Mi smo ga ostaviti gdje se nalazi na desnoj strani zida. 79 00:03:38,590 --> 00:03:41,060 Sada se kreće na, 3 manji od 5. 80 00:03:41,060 --> 00:03:44,160 Tako smo ga prebaciti s prvim elementom samo pravo na zidu. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 Sada, preselio sam se u zid do jednog. 83 00:03:50,750 --> 00:03:53,010 Sada se kreće na 8.. 84 00:03:53,010 --> 00:03:56,480 8 je veći od 5, i tako smo ga ostaviti. 85 00:03:56,480 --> 00:03:58,720 4 manji od 5, pa smo ga prebacili. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 I dalje. 88 00:04:03,570 --> 00:04:04,820 I dalje. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> Svaki put kad smo ponoviti postupak na lijeve i desne strane polja. mi 91 00:04:13,670 --> 00:04:17,010 odabrati stožer i raditi usporedbe i stvoriti još jednu razinu lijevo i 92 00:04:17,010 --> 00:04:18,240 pravo subarrays. 93 00:04:18,240 --> 00:04:21,500 Ovaj rekurzivna poziv će se nastaviti sve dok možemo doći do kraja, kada smo 94 00:04:21,500 --> 00:04:25,290 podijeljen cjelokupni niz u samo subarrays duljine 1. 95 00:04:25,290 --> 00:04:28,060 Od tamo, znamo niz sortiran jer svaki element ima, na 96 00:04:28,060 --> 00:04:29,330 nekom trenutku, bio pivot. 97 00:04:29,330 --> 00:04:32,720 Drugim riječima, za svaki element, sve Brojevi na lijevo su manje 98 00:04:32,720 --> 00:04:36,420 vrijednosti i sve brojeve zar ima veće vrijednosti. 99 00:04:36,420 --> 00:04:38,980 >> Ova metoda djeluje jako dobro, ako vrijednost zakretanja odabrana 100 00:04:38,980 --> 00:04:41,930 otprilike u sredini raspon vrijednosti popis. 101 00:04:41,930 --> 00:04:45,630 To bi značilo da, nakon što smo premjestiti Elementi okolo, ima oko onoliko 102 00:04:45,630 --> 00:04:48,390 elemenata na lijevoj pivota kao što postoje u desno. 103 00:04:48,390 --> 00:04:52,380 A podjela-i-osvajanje priroda Quicksort algoritam tada uzima 104 00:04:52,380 --> 00:04:53,850 puna prednost. 105 00:04:53,850 --> 00:04:57,500 To stvara runtime od O (n log n,) n zato moramo učiniti n minus 1. 106 00:04:57,500 --> 00:05:01,640 usporedbe o svakoj generaciji i zapisnik n, jer moramo podijeliti popis 107 00:05:01,640 --> 00:05:03,210 log n puta. 108 00:05:03,210 --> 00:05:06,160 Međutim, u najgorem slučaju, to Algoritam zapravo može biti O (n 109 00:05:06,160 --> 00:05:09,850 kvadrat.) Pretpostavimo da na svakoj generaciji, pivot samo tako dogodi da bude 110 00:05:09,850 --> 00:05:12,520 najmanji ili najveći brojevi sređujemo. 111 00:05:12,520 --> 00:05:15,870 To bi značilo da se razbije popis n puta i odluka n minus 1 112 00:05:15,870 --> 00:05:17,690 usporedbe svaki put. 113 00:05:17,690 --> 00:05:20,490 Dakle, o n kvadrat. 114 00:05:20,490 --> 00:05:22,000 >> Kako možemo unaprijediti način? 115 00:05:22,000 --> 00:05:25,100 Jedan dobar način za poboljšanje metoda je smanjiti vjerojatnost da 116 00:05:25,100 --> 00:05:28,150 runtime je ikada zapravo o n kvadrat. 117 00:05:28,150 --> 00:05:31,860 Zapamtite ovo najgore, najgori scenarij može dogoditi samo kada 118 00:05:31,860 --> 00:05:35,320 stožer izabrao je uvijek najviše ili najniža vrijednost u polju. 119 00:05:35,320 --> 00:05:38,630 Da bi se to je manje vjerojatno da će se dogoditi, možemo pronaći stožer by 120 00:05:38,630 --> 00:05:42,610 Odabirom više elemenata i uzimanje srednju vrijednost. 121 00:05:42,610 --> 00:05:44,650 >> Moje ime je Mark Grozen-Smith, i to je CS50. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> Radi jednostavnosti, pretpostavimo da su oni stvari su samo cijeli brojevi, ali 124 00:05:50,930 --> 00:05:51,970 Znam da Quicksert - 125 00:05:51,970 --> 00:05:53,160 Quicksert? 126 00:05:53,160 --> 00:05:55,200 Oprostite. 127 00:05:55,200 --> 00:06:02,000 >> Ovdje imamo cijeli brojevi 6, 5, 1, 3, 8, 4, 9. 128 00:06:02,000 --> 00:06:03,200 >> ZVUČNIK 1: Stvarno? 129 00:06:03,200 --> 00:06:04,850 >> ZVUČNIK 2: Nemojte tu stati. 130 00:06:04,850 --> 00:06:06,100 >> ZVUČNIK 1: Stvarno? 131 00:06:06,100 --> 00:06:08,491