1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARK GROZEN-Smith: Živjo, jaz sem Mark Grozen-Smith, in to je hitro urejanje. 3 00:00:10,390 --> 00:00:13,520 Tako kot vstavljanja vrste in mehurček sort, hitro urejanje, je algoritem za 4 00:00:13,520 --> 00:00:15,720 sortiranje seznam ali paleto stvari. 5 00:00:15,720 --> 00:00:19,080 Zaradi enostavnosti predpostavimo, da tisti, stvari so le cela števila, vendar 6 00:00:19,080 --> 00:00:22,060 vedo, da hitro urejanje dela za več kot le številke. 7 00:00:22,060 --> 00:00:24,720 Začeti je malce bolj zapleteno od vstavitve ali mehurček, vendar je 8 00:00:24,720 --> 00:00:27,560 tudi veliko bolj učinkovit V večini primerov. 9 00:00:27,560 --> 00:00:28,150 Počakaj malo. 10 00:00:28,150 --> 00:00:30,760 Ali je pravkar rekel "najbolj primerov, "ne" vse "? 11 00:00:30,760 --> 00:00:31,710 Zanimivo je, št. 12 00:00:31,710 --> 00:00:33,560 Ne v vseh primerih enaka. 13 00:00:33,560 --> 00:00:36,650 Ne skrbite za to podrobnost, če ti niso videli velik O zapis še ni, vendar 14 00:00:36,650 --> 00:00:39,730 Hitro urejanje je O (n kvadrat) algoritem v najslabšem primeru, tako kot 15 00:00:39,730 --> 00:00:41,430 vstavljanje ali bubble sort. 16 00:00:41,430 --> 00:00:44,950 Vendar pa običajno deluje bolj kot stari analogni m algoritem. 17 00:00:44,950 --> 00:00:45,750 Zakaj? 18 00:00:45,750 --> 00:00:46,810 Bomo dobili nazaj kasneje. 19 00:00:46,810 --> 00:00:49,610 Ampak za zdaj, kaj je pravkar izvedeli, kako hitro urejanje deluje. 20 00:00:49,610 --> 00:00:53,080 >> Torej, kaj je sprehod skozi Quicksorting to matrika celih števil od najmanjše 21 00:00:53,080 --> 00:00:54,260 do največjega. 22 00:00:54,260 --> 00:01:00,110 Tukaj imamo cela števila 6, 5, 1, 3, 8, 4, 7, 9, in 2. 23 00:01:00,110 --> 00:01:03,480 Najprej smo izbrali končni element To polje - v tem primeru dve - 24 00:01:03,480 --> 00:01:06,870 in pozivajo, da "pivot". Nato smo začnete iskati na dveh stvareh - 25 00:01:06,870 --> 00:01:10,220 ena, najmanjši indeks, ki bom se nanašajo kot bivanje na desni strani 26 00:01:10,220 --> 00:01:13,970 steno, in dva, levega element, ki sem ga pokličem "tok 27 00:01:13,970 --> 00:01:17,260 element. "Kaj bomo storili, je poglej vse druge elemente, druge 28 00:01:17,260 --> 00:01:20,930 kot pivot, in dal vse elemente manjši od vrtišča do 29 00:01:20,930 --> 00:01:24,140 levo steno in vse tiste, večji od vrtišča do 30 00:01:24,140 --> 00:01:25,570 desni strani stene. 31 00:01:25,570 --> 00:01:29,560 Potem, na koncu, bomo padec pivot prav na tej steni, da ga med 32 00:01:29,560 --> 00:01:32,970 vse številke manjši, kot je in vse številke večje. 33 00:01:32,970 --> 00:01:34,460 >> Torej, kaj je to. 34 00:01:34,460 --> 00:01:38,540 Pick up 2, dal na steno se začne, in pokličite 6 "tekoče 35 00:01:38,540 --> 00:01:41,590 element. "Zato smo želeli videti na Naš trenutni element, 6. 36 00:01:41,590 --> 00:01:44,200 In ker je večji od 2, smo ga pusti tam 37 00:01:44,200 --> 00:01:45,610 desni strani stene. 38 00:01:45,610 --> 00:01:48,980 Potem pa gremo naprej gledati na 5 kot naš Sedanji element in videli, da je to 39 00:01:48,980 --> 00:01:51,840 je spet večji od vrtišča, tako da pustite, kjer je na desni strani 40 00:01:51,840 --> 00:01:53,190 strani stene. 41 00:01:53,190 --> 00:01:53,880 Gremo naprej. 42 00:01:53,880 --> 00:01:56,750 Naš trenutni element Zdaj 1, in - oh. 43 00:01:56,750 --> 00:01:58,030 To je zdaj drugačna. 44 00:01:58,030 --> 00:02:00,890 Sedanji element je sedaj manjša od pivot, zato smo želeli, da bi ga 45 00:02:00,890 --> 00:02:02,570 na levi strani stene. 46 00:02:02,570 --> 00:02:06,555 Če želite to narediti, kaj je samo stikalo Trenutna element z najmanjšim indeksom 47 00:02:06,555 --> 00:02:07,970 sedi samo na desni steni. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 Zdaj pa gremo v steno do enega indeksa do 1 je na levi 50 00:02:17,570 --> 00:02:19,750 strani zidu sedaj. 51 00:02:19,750 --> 00:02:20,310 >> Čakati. 52 00:02:20,310 --> 00:02:23,450 Pravkar sem pomešal elemente na desna stran od stene, kajne? 53 00:02:23,450 --> 00:02:23,890 Ne skrbite. 54 00:02:23,890 --> 00:02:24,930 To je v redu. 55 00:02:24,930 --> 00:02:27,570 Edina stvar, ki nam je mar za zdaj je, da so vsi ti elementi na 56 00:02:27,570 --> 00:02:29,570 Pravica do stene, večji od vrtišča. 57 00:02:29,570 --> 00:02:31,760 Ne Dejanski vrstni red je še domneva. 58 00:02:31,760 --> 00:02:33,200 >> Zdaj pa nazaj k sortiranju. 59 00:02:33,200 --> 00:02:35,840 Tako da bomo še naprej gledaš ostali elementi. 60 00:02:35,840 --> 00:02:39,075 In v tem primeru vidimo, da obstajajo drugih elementov najmanj 61 00:02:39,075 --> 00:02:42,100 pivot, tako da smo jih vsi na dopustu desna stran od stene. 62 00:02:42,100 --> 00:02:45,980 Končno smo prišli do trenutnega elementa in vidimo, da je nihalna. 63 00:02:45,980 --> 00:02:48,830 No, to pomeni, da imamo dva oddelki niz, prvega počutje 64 00:02:48,830 --> 00:02:51,820 majhna na čepom in na levi strani stene, drugi pa 65 00:02:51,820 --> 00:02:54,500 večji od vrtišča do desna stran od stene. 66 00:02:54,500 --> 00:02:57,040 Želimo postaviti pivot element med dva, in potem bomo vedeli, 67 00:02:57,040 --> 00:03:01,000 da je nihalna v desnem Končni razvrščeni mesto. 68 00:03:01,000 --> 00:03:04,980 Tako smo preklopite na prvi element na desna stran stene s čepom, 69 00:03:04,980 --> 00:03:06,410 in vemo pivot je v pravem položaju. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> Mi ponovite ta postopek za subarrays levo in desno od pivot. 72 00:03:15,650 --> 00:03:18,700 Ker zadnja subarray je le ena element dolgo vemo, da je že 73 00:03:18,700 --> 00:03:22,480 sortirani, ker kako si lahko iz odredi, če si samo en element? 74 00:03:22,480 --> 00:03:28,860 Za desni strani subarray smo vidimo, da je nihalna 5, in steno 75 00:03:28,860 --> 00:03:32,250 je pravkar zapustil v 6. 76 00:03:32,250 --> 00:03:34,970 In trenutni element tudi Začne se kot 6. 77 00:03:34,970 --> 00:03:36,200 Torej 6 večji od 5. 78 00:03:36,200 --> 00:03:38,590 Mi pustimo, kjer je na desna stran od stene. 79 00:03:38,590 --> 00:03:41,060 Zdaj pa se gibljejo na, 3 manj kot 5. 80 00:03:41,060 --> 00:03:44,160 Zato smo ga vključite s prvim elementom ravno prav stene. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 Zdaj pa sem se preselil v steno navzgor za eno mesto. 83 00:03:50,750 --> 00:03:53,010 Zdaj pa se gibljejo na 8.. 84 00:03:53,010 --> 00:03:56,480 8 je večja od 5, in zato smo ga zapustiti. 85 00:03:56,480 --> 00:03:58,720 4 je manj kot 5, tako da smo jo vključite. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 In naprej. 88 00:04:03,570 --> 00:04:04,820 In naprej. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> Vsakič, ko postopek ponovite na levi in ​​desni strani matrike. smo 91 00:04:13,670 --> 00:04:17,010 Izberite pivot in narediti primerjave in ustvariti novo raven levo in 92 00:04:17,010 --> 00:04:18,240 desna subarrays. 93 00:04:18,240 --> 00:04:21,500 Ta rekurzivni klic, se bo nadaljevalo, dokler pridemo do konca, ko smo se 94 00:04:21,500 --> 00:04:25,290 razdeli celotno paleto v le subarrays dolžine 1. 95 00:04:25,290 --> 00:04:28,060 Od tam pa vemo, matrika je razvrščen saj ima vsak element, na 96 00:04:28,060 --> 00:04:29,330 nekatere točke, je pivot. 97 00:04:29,330 --> 00:04:32,720 Z drugimi besedami, za vsak element, vsi številke na levi so manj 98 00:04:32,720 --> 00:04:36,420 vrednote in vse številke na pravico imajo večje vrednosti. 99 00:04:36,420 --> 00:04:38,980 >> Ta metoda deluje zelo dobro, če vrednost izbranega vrtilnega 100 00:04:38,980 --> 00:04:41,930 približno na sredini razpon vrednot seznama. 101 00:04:41,930 --> 00:04:45,630 To bi pomenilo, da je, potem ko se gibljemo elementi okrog, obstaja približno toliko 102 00:04:45,630 --> 00:04:48,390 elementi na levi strani vrtišča kot so na desno. 103 00:04:48,390 --> 00:04:52,380 In razkorak-in-vladaj narava Hitro urejanje algoritem se nato upošteva 104 00:04:52,380 --> 00:04:53,850 celoti izkoristijo. 105 00:04:53,850 --> 00:04:57,500 To ustvarja runtime od O (n log n) n, ker moramo narediti n minus 1 106 00:04:57,500 --> 00:05:01,640 primerjave za vsako generacijo in se prijavite n ker moramo razdeliti seznam 107 00:05:01,640 --> 00:05:03,210 log n-krat. 108 00:05:03,210 --> 00:05:06,160 Vendar pa v najslabšem primeru, to Algoritem lahko dejansko O (n 109 00:05:06,160 --> 00:05:09,850 kvadrat.) Recimo, da na vsaki generaciji, pivot prav tako se zgodi, da bo 110 00:05:09,850 --> 00:05:12,520 najmanjši ali največji številke smo sortiranje. 111 00:05:12,520 --> 00:05:15,870 To bi pomenilo zrušijo seznam n-krat in izdelava n minus 1 112 00:05:15,870 --> 00:05:17,690 primerjave vsak čas. 113 00:05:17,690 --> 00:05:20,490 Tako O N kvadrat. 114 00:05:20,490 --> 00:05:22,000 >> Kako lahko izboljšamo način? 115 00:05:22,000 --> 00:05:25,100 En dober način, da bi izboljšali način je naj bi zmanjšali verjetnost, da 116 00:05:25,100 --> 00:05:28,150 teka je doslej dejansko o n kvadrat. 117 00:05:28,150 --> 00:05:31,860 Zapomni si to najslabši v najslabšem primeru se lahko zgodi le, če 118 00:05:31,860 --> 00:05:35,320 Izbrani pivot je vedno najvišja ali najnižja vrednost v matriki. 119 00:05:35,320 --> 00:05:38,630 Da bi zagotovili, da je to manj verjetno, da se zgodi, najdemo pivot, ki jih 120 00:05:38,630 --> 00:05:42,610 izbiro več elementov in ob srednjo vrednost. 121 00:05:42,610 --> 00:05:44,650 >> Moje ime je Mark Grozen-Smith, in to je CS50. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> Zaradi enostavnosti predpostavimo, da tisti, stvari so le cela števila, vendar 124 00:05:50,930 --> 00:05:51,970 vedeti, da Quicksert - 125 00:05:51,970 --> 00:05:53,160 Quicksert? 126 00:05:53,160 --> 00:05:55,200 Žal mi je. 127 00:05:55,200 --> 00:06:02,000 >> Tukaj imamo cela 6, 5, 1, 3, 8, 4, 9. 128 00:06:02,000 --> 00:06:03,200 >> SPEAKER 1: Res? 129 00:06:03,200 --> 00:06:04,850 >> SPEAKER 2: Ne ustavi tam. 130 00:06:04,850 --> 00:06:06,100 >> SPEAKER 1: Res? 131 00:06:06,100 --> 00:06:08,491