1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARK GROZEN-SMITH: Hei, olen Mark Grozen-Smith, ja tämä on Quicksort. 3 00:00:10,390 --> 00:00:13,520 Aivan kuten lisäyslajittelu ja kupla lajitella, Quicksort on algoritmi 4 00:00:13,520 --> 00:00:15,720 lajittelu lista tai joukko asioita. 5 00:00:15,720 --> 00:00:19,080 Yksinkertaisuuden vuoksi oletetaan, että nämä asiat ovat vain kokonaislukuja, mutta 6 00:00:19,080 --> 00:00:22,060 tietää, että Quicksort toimii enemmän kuin vain numeroita. 7 00:00:22,060 --> 00:00:24,720 Quickstart on hieman monimutkaisempi kuin asettamisen tai kupla, mutta se on 8 00:00:24,720 --> 00:00:27,560 myös paljon tehokkaampia useimmissa tapauksissa. 9 00:00:27,560 --> 00:00:28,150 Hetkinen. 10 00:00:28,150 --> 00:00:30,760 Sanoiko hän "kaikkein tapauksissa "ei" kaikki "? 11 00:00:30,760 --> 00:00:31,710 Mielenkiintoista on, no. 12 00:00:31,710 --> 00:00:33,560 Ei kaikissa tapauksissa ovat samat. 13 00:00:33,560 --> 00:00:36,650 Älä ole huolissasi tämän yksityiskohdan jos ole nähnyt Big O merkintä vielä, mutta 14 00:00:36,650 --> 00:00:39,730 Quicksort O (n potenssiin) algoritmi pahimmillaan, aivan kuten 15 00:00:39,730 --> 00:00:41,430 paikoilleen tai kupla lajitella. 16 00:00:41,430 --> 00:00:44,950 Kuitenkin, se toimii tyypillisesti paljon enemmän kuin vanha analoginen m algoritmi. 17 00:00:44,950 --> 00:00:45,750 Miksi? 18 00:00:45,750 --> 00:00:46,810 Palaamme siihen myöhemmin. 19 00:00:46,810 --> 00:00:49,610 Mutta nyt haluan vain oppia miten Quicksort toimii. 20 00:00:49,610 --> 00:00:53,080 >> Joten kulkea Quicksorting tämän joukko kokonaislukuja pienimmästä 21 00:00:53,080 --> 00:00:54,260 suurimmalle. 22 00:00:54,260 --> 00:01:00,110 Täällä meillä on kokonaislukuja 6, 5, 1, 3, 8, 4, 7, 9, ja 2. 23 00:01:00,110 --> 00:01:03,480 Ensin haemme viimeisenä osana Tämän array - tässä tapauksessa kaksi - 24 00:01:03,480 --> 00:01:06,870 ja soittaa, että "pivot." Seuraavaksi alkaa tarkastella kahta asiaa - 25 00:01:06,870 --> 00:01:10,220 yksi, pienin indeksi, joka Kutsun niin pysyä oikealla 26 00:01:10,220 --> 00:01:13,970 seinään, ja kaksi, vasemmanpuoleisin elementti, joka soitan "nykyinen 27 00:01:13,970 --> 00:01:17,260 elementti. "Mitä me aiomme tehdä, on näyttää kaikki muut elementit, muut 28 00:01:17,260 --> 00:01:20,930 kuin pivot, ja laittaa kaikki elementit pienempi kuin pivot 29 00:01:20,930 --> 00:01:24,140 vasen seinä ja kaikki ne suurempi kuin pivot 30 00:01:24,140 --> 00:01:25,570 oikea seinää. 31 00:01:25,570 --> 00:01:29,560 Sitten lopuksi, me pudottaa pivot oikealle että seinälle laittaa se välillä 32 00:01:29,560 --> 00:01:32,970 kaikki numerot pienempi kuin se ja kaikki numerot suurempi. 33 00:01:32,970 --> 00:01:34,460 >> Tehdäänpä että. 34 00:01:34,460 --> 00:01:38,540 Poimia 2, laittaa seinään alussa, ja soita 6 "nykyinen 35 00:01:38,540 --> 00:01:41,590 elementti. "Joten haluamme tarkastella nykyinen elementti, 6. 36 00:01:41,590 --> 00:01:44,200 Ja koska se on suurempi kuin 2, jätämme sen siihen 37 00:01:44,200 --> 00:01:45,610 oikea seinää. 38 00:01:45,610 --> 00:01:48,980 Sitten siirrymme katsomaan 5 meidän elementin ja nähdä, että tämä 39 00:01:48,980 --> 00:01:51,840 on jälleen suurempi kuin pivot, joten jätä se jos se on oikealla 40 00:01:51,840 --> 00:01:53,190 puolella seinää. 41 00:01:53,190 --> 00:01:53,880 Siirrymme. 42 00:01:53,880 --> 00:01:56,750 Nykyinen elementti on nyt 1, ja - oh. 43 00:01:56,750 --> 00:01:58,030 Tämä on nyt erilainen. 44 00:01:58,030 --> 00:02:00,890 Elementin on nyt pienempi kuin pivot, joten haluamme laittaa sen 45 00:02:00,890 --> 00:02:02,570 vasemmalla puolella seinää. 46 00:02:02,570 --> 00:02:06,555 Voit tehdä tämän, nyt vain vaihtaa elementin, jolla on pienin indeksi 47 00:02:06,555 --> 00:02:07,970 istuu juuri oikealla seinään. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 Nyt siirrymme seinää ylös yksi indeksi joten 1 on vasemmalla 50 00:02:17,570 --> 00:02:19,750 puolella seinää nyt. 51 00:02:19,750 --> 00:02:20,310 >> Odota. 52 00:02:20,310 --> 00:02:23,450 Olen vain sekaisin elementtejä oikealla puolella seinää, enkö? 53 00:02:23,450 --> 00:02:23,890 Älä huoli. 54 00:02:23,890 --> 00:02:24,930 Se on hyvä. 55 00:02:24,930 --> 00:02:27,570 Ainoa asia välitämme nyt on, että kaikki nämä tekijät 56 00:02:27,570 --> 00:02:29,570 oikealla seinällä on isompi kuin pivot. 57 00:02:29,570 --> 00:02:31,760 Mitään varsinaista järjestys oletetaan vielä. 58 00:02:31,760 --> 00:02:33,200 >> Nyt takaisin lajittelu. 59 00:02:33,200 --> 00:02:35,840 Joten jatkamme katsomalla loput elementit. 60 00:02:35,840 --> 00:02:39,075 Ja tässä tapauksessa, näemme, että on olemassa no Muille aineille alle 61 00:02:39,075 --> 00:02:42,100 pivot, joten jätämme ne kaikki oikealla puolella seinää. 62 00:02:42,100 --> 00:02:45,980 Lopuksi saamme elementin ja nähdä, että se on pivot. 63 00:02:45,980 --> 00:02:48,830 Nyt, se tarkoittaa, että meillä on kaksi osia array, joista ensimmäinen on 64 00:02:48,830 --> 00:02:51,820 pieni akseli-ja vasemmalla puolella seinän, ja toinen on 65 00:02:51,820 --> 00:02:54,500 suurempi kuin pivot oikealla puolella seinää. 66 00:02:54,500 --> 00:02:57,040 Haluamme laittaa saranaelementin välillä kaksi, ja sitten me tiedämme 67 00:02:57,040 --> 00:03:01,000 että nivel on sen oikeassa lopullinen lajitellut paikka. 68 00:03:01,000 --> 00:03:04,980 Joten me vaihtaa ensimmäisen elementin oikealla puolella seinään pivot, 69 00:03:04,980 --> 00:03:06,410 ja me tiedämme pivot n sen oikeaan asentoon. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> Sitten toista tämä prosessi alaryhmien vasemmalla ja oikealla pivot. 72 00:03:15,650 --> 00:03:18,700 Koska viimeinen alaryhmä on vain yksi elementti pitkä, me tiedämme, että on jo 73 00:03:18,700 --> 00:03:22,480 lajitellut koska miten voit olla pois tilata jos olet vain yksi osa? 74 00:03:22,480 --> 00:03:28,860 Sillä oikealla puolella alaryhmä, me nähdä, että nivel on 5, ja seinä 75 00:03:28,860 --> 00:03:32,250 on vain jäljellä 6. 76 00:03:32,250 --> 00:03:34,970 Ja elementin myös alkaa out 6. 77 00:03:34,970 --> 00:03:36,200 Joten 6 on suurempi kuin 5. 78 00:03:36,200 --> 00:03:38,590 Jätämme missä se on oikealla puolella seinää. 79 00:03:38,590 --> 00:03:41,060 Nyt siirrymme, 3 on alle 5. 80 00:03:41,060 --> 00:03:44,160 Joten me vaihtaa sen ensimmäisen elementin juuri oikealla seinään. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 Nyt muutin seinään yhden. 83 00:03:50,750 --> 00:03:53,010 Nyt siirrymme 8. 84 00:03:53,010 --> 00:03:56,480 8 on suurempi kuin 5, ja niin jätämme sen. 85 00:03:56,480 --> 00:03:58,720 4 on alle 5, joten kytke se. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 Ja jatkuu. 88 00:04:03,570 --> 00:04:04,820 Ja jatkuu. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> Aina toistamme prosessin vasemmalla ja oikealla puolella jono. me 91 00:04:13,670 --> 00:04:17,010 Valitse pivot ja tehdä vertailuja ja luoda toisen tason vasemmalle ja 92 00:04:17,010 --> 00:04:18,240 oikea alaryhmien. 93 00:04:18,240 --> 00:04:21,500 Tämä rekursiokutsu jatkuu lähestyessä loppuaan, kun olemme 94 00:04:21,500 --> 00:04:25,290 jaetaan yleistä array osaksi vain alaryhmien pituuden 1. 95 00:04:25,290 --> 00:04:28,060 Sieltä tiedämme array lajitellaan koska jokainen elementti on kello 96 00:04:28,060 --> 00:04:29,330 Jossakin vaiheessa ollut pivot. 97 00:04:29,330 --> 00:04:32,720 Toisin sanoen, jokainen elementti, kaikki numerot vasemmalle ovat vähemmän 98 00:04:32,720 --> 00:04:36,420 arvot ja kaikki numerot oikeus on suuremmat arvot. 99 00:04:36,420 --> 00:04:38,980 >> Tämä menetelmä toimii hyvin, jos arvo pivot valittu on 100 00:04:38,980 --> 00:04:41,930 suunnilleen keskellä valikoima listan arvoja. 101 00:04:41,930 --> 00:04:45,630 Tämä merkitsisi sitä, että sen jälkeen siirrymme elementtejä noin, siellä suunnilleen yhtä monta 102 00:04:45,630 --> 00:04:48,390 elementtejä vasemmalla pivot koska on olemassa oikealle. 103 00:04:48,390 --> 00:04:52,380 Ja hajota ja-valloittaa luonne Quicksort algoritmi otetaan sitten 104 00:04:52,380 --> 00:04:53,850 täyden hyödyn. 105 00:04:53,850 --> 00:04:57,500 Tämä luo runtime O (n log n,) n, koska meidän on tehtävä n miinus 1 106 00:04:57,500 --> 00:05:01,640 vertailut jokainen sukupolvi ja log n, koska meillä on jakaa luettelon 107 00:05:01,640 --> 00:05:03,210 log n kertaa. 108 00:05:03,210 --> 00:05:06,160 Kuitenkin pahimmassa tapauksissa tämä algoritmi voi todella olla O (n 109 00:05:06,160 --> 00:05:09,850 potenssiin.) Oletetaan kunkin sukupolven, pivot vain niin sattuu olemaan 110 00:05:09,850 --> 00:05:12,520 pienin tai suurin numerot olemme lajittelu. 111 00:05:12,520 --> 00:05:15,870 Tämä merkitsisi hajottaa lista n kertaa ja päätöksenteossa n miinus 1 112 00:05:15,870 --> 00:05:17,690 vertailut joka ikinen kerta. 113 00:05:17,690 --> 00:05:20,490 Siten O n potenssiin. 114 00:05:20,490 --> 00:05:22,000 >> Miten voimme parantaa menetelmä? 115 00:05:22,000 --> 00:05:25,100 Yksi hyvä tapa parantaa menetelmä on leikata todennäköisyys, että 116 00:05:25,100 --> 00:05:28,150 runtime on koskaan itse O n potenssiin. 117 00:05:28,150 --> 00:05:31,860 Muista tämä pahin pahimmassa tapauksessa voi tapahtua vasta, kun 118 00:05:31,860 --> 00:05:35,320 pivot valittu on aina korkein tai pienimmän arvon jono. 119 00:05:35,320 --> 00:05:38,630 Tämän varmistamiseksi on vähemmän todennäköisesti tapahtuu, voimme löytää Pivot 120 00:05:38,630 --> 00:05:42,610 valitsemalla useita elementtejä ja ottaen mediaani. 121 00:05:42,610 --> 00:05:44,650 >> Nimeni on Mark Grozen-Smith, ja tämä on CS50. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> Yksinkertaisuuden vuoksi oletetaan, että nämä asiat ovat vain kokonaislukuja, mutta 124 00:05:50,930 --> 00:05:51,970 tietää, että Quicksert - 125 00:05:51,970 --> 00:05:53,160 Quicksert? 126 00:05:53,160 --> 00:05:55,200 Anteeksi. 127 00:05:55,200 --> 00:06:02,000 >> Täällä meillä on kokonaislukuja 6, 5, 1, 3, 8, 4, 9. 128 00:06:02,000 --> 00:06:03,200 >> SPEAKER 1: Todellako? 129 00:06:03,200 --> 00:06:04,850 >> SPEAKER 2: Älä lopeta siellä. 130 00:06:04,850 --> 00:06:06,100 >> SPEAKER 1: Todellako? 131 00:06:06,100 --> 00:06:08,491