1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARK GROZEN-SMITH: Bună, eu sunt Mark Grozen-Smith, iar acest lucru este Quicksort. 3 00:00:10,390 --> 00:00:13,520 La fel ca un fel de introducere și bule fel, Quicksort este un algoritm pentru 4 00:00:13,520 --> 00:00:15,720 sortare o listă sau o serie de lucruri. 5 00:00:15,720 --> 00:00:19,080 Pentru simplitate, să presupunem că cei lucrurile sunt doar numere întregi, dar 6 00:00:19,080 --> 00:00:22,060 Știu că Quicksort funcționează pentru mai mult decât numere. 7 00:00:22,060 --> 00:00:24,720 QuickStart este un pic mai complicat de inserare sau cu bule, dar e 8 00:00:24,720 --> 00:00:27,560 de asemenea, mult mai eficient în cele mai multe cazuri. 9 00:00:27,560 --> 00:00:28,150 Așteaptă o secundă. 10 00:00:28,150 --> 00:00:30,760 A spune doar "cel mai cazuri, "nu" tot "? 11 00:00:30,760 --> 00:00:31,710 Interesant, nr. 12 00:00:31,710 --> 00:00:33,560 Nu toate cazurile sunt la fel. 13 00:00:33,560 --> 00:00:36,650 Nu vă faceți griji cu privire la acest detaliu, dacă nu s-au văzut notație mare O încă, dar 14 00:00:36,650 --> 00:00:39,730 Quicksort este un O (n pătrat) algoritm cel mai rău caz, la fel ca 15 00:00:39,730 --> 00:00:41,430 inserare sau bule de sortare. 16 00:00:41,430 --> 00:00:44,950 Cu toate acestea, ea acționează de obicei mult mai ca un m algoritm analog vechi. 17 00:00:44,950 --> 00:00:45,750 De ce? 18 00:00:45,750 --> 00:00:46,810 Vom reveni la asta mai târziu. 19 00:00:46,810 --> 00:00:49,610 Dar de acum, hai să învățăm cum funcționează Quicksort. 20 00:00:49,610 --> 00:00:53,080 >> Deci, haideți să mergem prin Quicksorting acest matrice de numere întregi de la cel mai mic 21 00:00:53,080 --> 00:00:54,260 la cel mai mare. 22 00:00:54,260 --> 00:01:00,110 Aici avem numerele întregi 6, 5, 1, 3, 8, 4, 7, 9, și 2. 23 00:01:00,110 --> 00:01:03,480 În primul rând, ne-am alege elementul final de această matrice - în acest caz, doi - 24 00:01:03,480 --> 00:01:06,870 și de apel ca "pivot". Apoi, ne-am începe să se uite la două lucruri - 25 00:01:06,870 --> 00:01:10,220 unul, cel mai scazut indice, pe care voi referi pentru ca stau la dreapta 26 00:01:10,220 --> 00:01:13,970 perete, și, doi, cel mai din stânga elemente, pe care le voi numi "curent 27 00:01:13,970 --> 00:01:17,260 Element. "Ceea ce vom face este uite toate celelalte elemente, altele 28 00:01:17,260 --> 00:01:20,930 decât pivotul, și a pus toate elementele mai mic decât pivotul la 29 00:01:20,930 --> 00:01:24,140 rămas din perete și toți cei mai mare decât pivotul la 30 00:01:24,140 --> 00:01:25,570 dreaptă a peretelui. 31 00:01:25,570 --> 00:01:29,560 Apoi, în cele din urmă, vom renunța la pivotul chiar pe perete să-l pună între 32 00:01:29,560 --> 00:01:32,970 toate numerele mai mici decât și toate numerele mai mari. 33 00:01:32,970 --> 00:01:34,460 >> Deci, haideți să facem asta. 34 00:01:34,460 --> 00:01:38,540 Pick up 2, a pus pe peretele de la început, și sunați la 6 "curent 35 00:01:38,540 --> 00:01:41,590 Element. "Așa că vrem să se uite la elementul nostru curent, 6. 36 00:01:41,590 --> 00:01:44,200 Și, din moment ce este mai mare decât 2, l-am lăsa acolo la 37 00:01:44,200 --> 00:01:45,610 dreaptă a peretelui. 38 00:01:45,610 --> 00:01:48,980 Apoi, vom trece la a privi la 5 ca noastre element de curent și să vedem că această 39 00:01:48,980 --> 00:01:51,840 este, din nou, mai mare decât pivotul, deci lăsați-l în cazul în care este pe dreapta 40 00:01:51,840 --> 00:01:53,190 parte a peretelui. 41 00:01:53,190 --> 00:01:53,880 Noi mergem mai departe. 42 00:01:53,880 --> 00:01:56,750 Elementul nostru actual este acum 1, si - oh. 43 00:01:56,750 --> 00:01:58,030 Acest lucru este diferit acum. 44 00:01:58,030 --> 00:02:00,890 Elementul curent este acum mai mică decât pivot, așa că vrem să-l puneți 45 00:02:00,890 --> 00:02:02,570 în partea stângă a peretelui. 46 00:02:02,570 --> 00:02:06,555 Pentru a face acest lucru, hai să porniți Element curent cu cel mai mic indice 47 00:02:06,555 --> 00:02:07,970 stând doar la dreptul de perete. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 Acum, vom trece zidul sus cu un index deci o este pe stânga 50 00:02:17,570 --> 00:02:19,750 parte a peretelui acum. 51 00:02:19,750 --> 00:02:20,310 >> Așteaptă. 52 00:02:20,310 --> 00:02:23,450 Am amestecat elementele din partea dreapta a peretelui, nu-i așa? 53 00:02:23,450 --> 00:02:23,890 Nu vă faceți griji. 54 00:02:23,890 --> 00:02:24,930 Asta e bine. 55 00:02:24,930 --> 00:02:27,570 Singurul lucru de care ne pasă de acum este că toate aceste elemente pentru a 56 00:02:27,570 --> 00:02:29,570 dreaptă a peretelui sunt mai mari decât pivotul. 57 00:02:29,570 --> 00:02:31,760 Nici un ordin real se presupune încă. 58 00:02:31,760 --> 00:02:33,200 >> Acum, înapoi la sortare. 59 00:02:33,200 --> 00:02:35,840 Deci, vom continua pe uita la restul elementelor. 60 00:02:35,840 --> 00:02:39,075 Și în acest caz, vom vedea că există există alte elemente mai puțin decât 61 00:02:39,075 --> 00:02:42,100 pivot, așa că le lăsa pe în partea dreaptă a peretelui. 62 00:02:42,100 --> 00:02:45,980 În cele din urmă, ajungem la elementul curent și a vedea că acesta este pivotul. 63 00:02:45,980 --> 00:02:48,830 Acum, ceea ce înseamnă că avem două secțiuni ale matrice, prima fiind 64 00:02:48,830 --> 00:02:51,820 mic pe pivotul și în partea stângă a peretelui, iar a doua fiind 65 00:02:51,820 --> 00:02:54,500 mai mare decât pivotul la partea dreaptă a peretelui. 66 00:02:54,500 --> 00:02:57,040 Vrem să pună elementul pivot între cei doi, iar apoi vom ști 67 00:02:57,040 --> 00:03:01,000 că pivotul este în dreptul său loc sortat finală. 68 00:03:01,000 --> 00:03:04,980 Deci, vom trece primul element pe partea dreaptă a peretelui cu pivotul, 69 00:03:04,980 --> 00:03:06,410 și știm că pivotul de în poziția sa potrivit. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> Atunci vom repeta acest proces pentru subarrays stânga și la dreapta a pivotului. 72 00:03:15,650 --> 00:03:18,700 De la ultima subarray este doar una , de mult timp, știm că e deja 73 00:03:18,700 --> 00:03:22,480 sortat, deoarece cum poți fi de comanda daca esti doar un element? 74 00:03:22,480 --> 00:03:28,860 Pentru partea dreaptă a subarray, am vedea că pivotul este 5, iar peretele 75 00:03:28,860 --> 00:03:32,250 este plecat doar de 6. 76 00:03:32,250 --> 00:03:34,970 Și elementul curent, de asemenea, începe ca 6. 77 00:03:34,970 --> 00:03:36,200 Deci 6 este mai mare de 5. 78 00:03:36,200 --> 00:03:38,590 Lăsăm în care se află pe partea dreaptă a peretelui. 79 00:03:38,590 --> 00:03:41,060 Acum, se deplasează pe, 3 este mai mică de 5. 80 00:03:41,060 --> 00:03:44,160 Deci, l-am schimba cu primul element doar dreptul peretelui. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 Acum, m-am mutat pe perete la unul. 83 00:03:50,750 --> 00:03:53,010 Acum, de a trece la 8. 84 00:03:53,010 --> 00:03:56,480 8 este mai mare de 5, și așa am pleca. 85 00:03:56,480 --> 00:03:58,720 4 este mai mică de 5, așa că l-am schimba. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 Și pe. 88 00:04:03,570 --> 00:04:04,820 Și pe. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> De fiecare dată când repetați procesul privind laturile stânga și dreapta de matrice. noi 91 00:04:13,670 --> 00:04:17,010 alege un pivot și de a face comparațiile și de a crea un alt nivel de stânga și 92 00:04:17,010 --> 00:04:18,240 subarrays dreapta. 93 00:04:18,240 --> 00:04:21,500 Acest apel recursiv va continua până vom ajunge la sfârșitul atunci când ne-am 94 00:04:21,500 --> 00:04:25,290 împărțit matrice de ansamblu în doar subarrays de lungime 1. 95 00:04:25,290 --> 00:04:28,060 De acolo, știm că matricea este sortat pentru că fiecare element are, la 96 00:04:28,060 --> 00:04:29,330 un moment dat, a fost un pivot. 97 00:04:29,330 --> 00:04:32,720 Cu alte cuvinte, pentru fiecare element, toate numerele de la stânga sunt mai puțin 98 00:04:32,720 --> 00:04:36,420 valorile și toate numerele de au dreptul de valori mai mari. 99 00:04:36,420 --> 00:04:38,980 >> Această metodă funcționează foarte bine în cazul în care valoare a pivotului este aleasă 100 00:04:38,980 --> 00:04:41,930 aproximativ la mijlocul Gama de valori lista. 101 00:04:41,930 --> 00:04:45,630 Acest lucru ar însemna că, după ce ne-am muta elemente, în jurul valorii de acolo despre cât mai multe 102 00:04:45,630 --> 00:04:48,390 elemente la stânga pivotului cum există la dreapta. 103 00:04:48,390 --> 00:04:52,380 Și natura divide et impera a Algoritm Quicksort este apoi luate 104 00:04:52,380 --> 00:04:53,850 profita din plin de. 105 00:04:53,850 --> 00:04:57,500 Acest lucru creează o execuție de O (n log n,) n pentru că avem de-a face n minus 1 106 00:04:57,500 --> 00:05:01,640 comparații cu privire la fiecare generație și jurnal n pentru că trebuie să împartă lista 107 00:05:01,640 --> 00:05:03,210 log n ori. 108 00:05:03,210 --> 00:05:06,160 Cu toate acestea, în cele mai rele cazuri, această algoritm poate fi de fapt, O (n 109 00:05:06,160 --> 00:05:09,850 pătrat.) Să presupunem că la fiecare generație, pivotul doar așa se întâmplă să fie 110 00:05:09,850 --> 00:05:12,520 mai mică sau cea mai mare a Numerele suntem de sortare. 111 00:05:12,520 --> 00:05:15,870 Acest lucru ar însemna de rupere jos lista de n ori și de luare n minus 1 112 00:05:15,870 --> 00:05:17,690 comparații fiecare dată. 113 00:05:17,690 --> 00:05:20,490 Astfel, o a n pătrat. 114 00:05:20,490 --> 00:05:22,000 >> Cum putem îmbunătăți metoda? 115 00:05:22,000 --> 00:05:25,100 O modalitate buna de a îmbunătăți metoda este pentru a reduce cu privire la probabilitatea ca 116 00:05:25,100 --> 00:05:28,150 runtime este vreodată de fapt o de n pătrat. 117 00:05:28,150 --> 00:05:31,860 Amintiți-vă acest lucru cel mai rău, cel mai rău caz se poate întâmpla doar atunci când 118 00:05:31,860 --> 00:05:35,320 pivot ales este întotdeauna cea mai mare sau cea mai mică valoare în matrice. 119 00:05:35,320 --> 00:05:38,630 Pentru a asigura acest lucru este mai puțin probabil să se întâmple, putem gasi pivotul de 120 00:05:38,630 --> 00:05:42,610 alegerea elemente multiple și luând valoarea medie. 121 00:05:42,610 --> 00:05:44,650 >> Numele meu este Mark Grozen-Smith, și acest lucru este CS50. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> Pentru simplitate, să presupunem că cei lucrurile sunt doar numere întregi, dar 124 00:05:50,930 --> 00:05:51,970 Știu că QUICKSERT - 125 00:05:51,970 --> 00:05:53,160 QUICKSERT? 126 00:05:53,160 --> 00:05:55,200 Scuze. 127 00:05:55,200 --> 00:06:02,000 >> Aici avem numerele întregi 6, 5, 1, 3, 8, 4, 9. 128 00:06:02,000 --> 00:06:03,200 >> SPEAKER 1: Serios? 129 00:06:03,200 --> 00:06:04,850 >> SPEAKER 2: Nu te opri aici. 130 00:06:04,850 --> 00:06:06,100 >> SPEAKER 1: Serios? 131 00:06:06,100 --> 00:06:08,491