1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARCA GROZEN-SMITH: Hola, sóc Marc Grozen-Smith, i aquesta és l'ordenació ràpida. 3 00:00:10,390 --> 00:00:13,520 Igual que l'ordenació per inserció i la bombolla espècie, l'ordenació ràpida és un algorisme per 4 00:00:13,520 --> 00:00:15,720 ordenar una llista o una matriu de coses. 5 00:00:15,720 --> 00:00:19,080 Per simplificar, suposarem que els les coses són només nombres enters, però 6 00:00:19,080 --> 00:00:22,060 sabem que treballa per a l'ordenació ràpida més enllà dels números. 7 00:00:22,060 --> 00:00:24,720 Inici ràpid és una mica més complicat d'inserció o de bombolles, però és 8 00:00:24,720 --> 00:00:27,560 també molt més eficient en la majoria dels casos. 9 00:00:27,560 --> 00:00:28,150 Espera un segon. 10 00:00:28,150 --> 00:00:30,760 ¿Va dir "més casos ", no" tots "? 11 00:00:30,760 --> 00:00:31,710 Curiosament, cap. 12 00:00:31,710 --> 00:00:33,560 No tots els casos són la mateixa. 13 00:00:33,560 --> 00:00:36,650 No et preocupis per aquest detall si no han vist la notació O gran encara, però 14 00:00:36,650 --> 00:00:39,730 Ordenació ràpida és una operació O (n al quadrat) algorisme en el pitjor, igual que 15 00:00:39,730 --> 00:00:41,430 inserció o espècie de bombolla. 16 00:00:41,430 --> 00:00:44,950 No obstant això, en general actua molt més com un vell m algorisme analògic. 17 00:00:44,950 --> 00:00:45,750 Per què? 18 00:00:45,750 --> 00:00:46,810 Ens posarem en contacte amb això més tard. 19 00:00:46,810 --> 00:00:49,610 Però per ara, anem a aprendre com funciona l'ordenació ràpida. 20 00:00:49,610 --> 00:00:53,080 >> Així que anem a caminar a través d'aquest Quicksorting matriu d'enters de menys 21 00:00:53,080 --> 00:00:54,260 a més gran. 22 00:00:54,260 --> 00:01:00,110 Aquí tenim els enters 6, 5, 1, 3, 8, 4, 7, 9, i 2. 23 00:01:00,110 --> 00:01:03,480 En primer lloc, vam triar l'element final de aquesta matriu - en aquest cas, dos - 24 00:01:03,480 --> 00:01:06,870 i cridar a que el "pivot". A continuació, es començar a tenir en compte dues coses - 25 00:01:06,870 --> 00:01:10,220 un, l'índex més baix, el que em referiré a com mantenir-se a la dreta del 26 00:01:10,220 --> 00:01:13,970 la paret, i, dos, el més a l'esquerra element, que vaig a cridar a la "corrent 27 00:01:13,970 --> 00:01:17,260 element. "El que farem és buscar tots els altres elements, altres 28 00:01:17,260 --> 00:01:20,930 que el pivot, i posar tots els elements més petit que el pivot per a la 29 00:01:20,930 --> 00:01:24,140 esquerra de la paret i tots aquells més gran que el pivot per a la 30 00:01:24,140 --> 00:01:25,570 dret de la paret. 31 00:01:25,570 --> 00:01:29,560 Llavors, finalment, ens deixarem caure el pivot just en aquesta paret per posar entre 32 00:01:29,560 --> 00:01:32,970 tots els números més petits del que i tots els números més grans. 33 00:01:32,970 --> 00:01:34,460 >> Així que anem a fer això. 34 00:01:34,460 --> 00:01:38,540 Llevant el 2, posar la paret a la començant, i truqui al 6 la "corrent 35 00:01:38,540 --> 00:01:41,590 element ". Així que volem veure nostre element actual, el 6. 36 00:01:41,590 --> 00:01:44,200 I ja que és més gran que el 2, el deixem aquí per a la 37 00:01:44,200 --> 00:01:45,610 dret de la paret. 38 00:01:45,610 --> 00:01:48,980 A continuació, passem a mirar el 5 com el nostre element actual i veure que aquesta 39 00:01:48,980 --> 00:01:51,840 és, de nou, més gran que el de pivot, per la qual cosa deixar-lo on està a la dreta 40 00:01:51,840 --> 00:01:53,190 costat de la paret. 41 00:01:53,190 --> 00:01:53,880 Seguim endavant. 42 00:01:53,880 --> 00:01:56,750 El nostre element actual és ara 1, i - oh. 43 00:01:56,750 --> 00:01:58,030 Això és diferent ara. 44 00:01:58,030 --> 00:02:00,890 L'element actual és ara menor que el pivot, pel que volem posar 45 00:02:00,890 --> 00:02:02,570 a l'esquerra de la paret. 46 00:02:02,570 --> 00:02:06,555 Per a això, canviarem la element actual amb l'índex més baix 47 00:02:06,555 --> 00:02:07,970 assegut just a la dreta de la paret. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 Ara, passem la paret fins a un índex de manera que el 1 és a l'esquerra 50 00:02:17,570 --> 00:02:19,750 costat de la paret ara. 51 00:02:19,750 --> 00:02:20,310 >> Esperi. 52 00:02:20,310 --> 00:02:23,450 Acabo confós els elements de la costat dret de la paret, no? 53 00:02:23,450 --> 00:02:23,890 No es preocupi. 54 00:02:23,890 --> 00:02:24,930 Això està bé. 55 00:02:24,930 --> 00:02:27,570 L'únic que ens importa per ara és que tots aquests elements a la 56 00:02:27,570 --> 00:02:29,570 dret de la paret són més grans que el pivot. 57 00:02:29,570 --> 00:02:31,760 No hi ha comanda actual s'assumeix encara. 58 00:02:31,760 --> 00:02:33,200 >> Ara, de tornada a la classificació. 59 00:02:33,200 --> 00:02:35,840 Així que continuem mirant la resta dels elements. 60 00:02:35,840 --> 00:02:39,075 I en aquest cas, veiem que hi ha no hi ha altres elements menys que el 61 00:02:39,075 --> 00:02:42,100 pivot, així que els deixem en tot la part dreta de la paret. 62 00:02:42,100 --> 00:02:45,980 Finalment, arribem a l'element actual i veure que és el pivot. 63 00:02:45,980 --> 00:02:48,830 Ara, això vol dir que tenim dos seccions de la matriu, el primer ésser 64 00:02:48,830 --> 00:02:51,820 petita al pivot i al costat esquerre de la paret, i el segon ser 65 00:02:51,820 --> 00:02:54,500 més gran que el pivot per a la costat dret de la paret. 66 00:02:54,500 --> 00:02:57,040 Volem posar l'element de pivot entre els dos, i llavors sabrem 67 00:02:57,040 --> 00:03:01,000 que el pivot té tot el dret lloc classificat final. 68 00:03:01,000 --> 00:03:04,980 Així que canviem el primer element de la costat dret de la paret amb el pivot, 69 00:03:04,980 --> 00:03:06,410 i sabem del pivot en la seva posició correcta. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> Després es repeteix aquest procés per al subarrays esquerra i dreta del pivot. 72 00:03:15,650 --> 00:03:18,700 Des de l'última submatriu és només una element llarg, sabem que això és ja 73 00:03:18,700 --> 00:03:22,480 ordenada, perquè com es pot estar fora de ordenar si vostè és només un element? 74 00:03:22,480 --> 00:03:28,860 Pel costat dret de la submatriu, ens veure que el pivot és 5, i el mur 75 00:03:28,860 --> 00:03:32,250 està just a l'esquerra de la 6. 76 00:03:32,250 --> 00:03:34,970 I l'element actual també que comença com el 6. 77 00:03:34,970 --> 00:03:36,200 Així que 6 és més gran que 5. 78 00:03:36,200 --> 00:03:38,590 Ho deixem on està en el costat dret de la paret. 79 00:03:38,590 --> 00:03:41,060 Ara, passant, 3 és menor que 5. 80 00:03:41,060 --> 00:03:44,160 Així que canviem amb el primer element tot just a la dreta de la paret. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 Ara, em vaig mudar de la paret fins a una. 83 00:03:50,750 --> 00:03:53,010 Ara, passant a la 8. 84 00:03:53,010 --> 00:03:56,480 8 és més gran que 5, i així ho vam deixar. 85 00:03:56,480 --> 00:03:58,720 La figura 4 és menor que 5, de manera que canviar ell. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 I en. 88 00:04:03,570 --> 00:04:04,820 I en. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> Cada vegada que repetim el procés en el costats esquerre i dret de la matriu. nosaltres 91 00:04:13,670 --> 00:04:17,010 triar un pivot i fer les comparacions i crear un altre nivell de l'esquerra i 92 00:04:17,010 --> 00:04:18,240 subarrays dreta. 93 00:04:18,240 --> 00:04:21,500 Aquesta crida recursiva continuarà fins arribem al final quan hem 94 00:04:21,500 --> 00:04:25,290 dividit la matriu global en només subconjunts de longitud 1. 95 00:04:25,290 --> 00:04:28,060 A partir d'aquí, sabem que la matriu s'ordena ja que cada element té, 96 00:04:28,060 --> 00:04:29,330 algun moment, ha estat un pivot. 97 00:04:29,330 --> 00:04:32,720 En altres paraules, per a cada element, tot els números a l'esquerra són menors 98 00:04:32,720 --> 00:04:36,420 valors i tots els números a la dret tenen majors valors. 99 00:04:36,420 --> 00:04:38,980 >> Aquest mètode funciona molt bé si el valor del pivot triat és 100 00:04:38,980 --> 00:04:41,930 aproximadament en el centre rang dels valors de la llista. 101 00:04:41,930 --> 00:04:45,630 Això significaria que, després que ens movem elements voltant, hi ha gairebé tants 102 00:04:45,630 --> 00:04:48,390 elements a l'esquerra del pivot ja que hi ha a la dreta. 103 00:04:48,390 --> 00:04:52,380 I la naturalesa de divideix i venceràs de l' Després es pren l'algorisme quicksort 104 00:04:52,380 --> 00:04:53,850 tot el profit a. 105 00:04:53,850 --> 00:04:57,500 Això crea un temps d'execució d'O (n log n,) el n perquè hem de fer n almenys 1 106 00:04:57,500 --> 00:05:01,640 comparacions en cada generació i registre n perquè hem de dividir la llista 107 00:05:01,640 --> 00:05:03,210 log n vegades. 108 00:05:03,210 --> 00:05:06,160 No obstant això, en el pitjor dels casos, aquest algorisme en realitat pot ser O (n 109 00:05:06,160 --> 00:05:09,850 al quadrat.) Suposem que en cada generació, el pivot que passa a ser el 110 00:05:09,850 --> 00:05:12,520 més petit o el més gran de la nombres que estem de classificació. 111 00:05:12,520 --> 00:05:15,870 Això significaria trencar la llista n vegades i la presa de N almenys 1 112 00:05:15,870 --> 00:05:17,690 comparacions cada vegada. 113 00:05:17,690 --> 00:05:20,490 Per tant, o de n al quadrat. 114 00:05:20,490 --> 00:05:22,000 >> Com podem millorar el mètode? 115 00:05:22,000 --> 00:05:25,100 Una bona manera de millorar el mètode és per reduir la probabilitat que 116 00:05:25,100 --> 00:05:28,150 el temps d'execució és sempre realment O de n al quadrat. 117 00:05:28,150 --> 00:05:31,860 Recordi que aquesta pitjor, pitjor dels casos només pot ocórrer quan la 118 00:05:31,860 --> 00:05:35,320 pivot triat és sempre el més alt o el valor més baix en la matriu. 119 00:05:35,320 --> 00:05:38,630 Per garantir que això és menys probable que passi, podem trobar el pivot per 120 00:05:38,630 --> 00:05:42,610 l'elecció de múltiples elements i tenint el valor de la mitjana. 121 00:05:42,610 --> 00:05:44,650 >> El meu nom és Mark Grozen-Smith, i això és CS50. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> Per simplificar, suposarem que els les coses són només nombres enters, però 124 00:05:50,930 --> 00:05:51,970 saber que QUICKSERT - 125 00:05:51,970 --> 00:05:53,160 QUICKSERT? 126 00:05:53,160 --> 00:05:55,200 Ho sento. 127 00:05:55,200 --> 00:06:02,000 >> Aquí tenim els enters 6, 5, 1, 3, 8, 4, 9. 128 00:06:02,000 --> 00:06:03,200 >> ALTAVEU 1: De debò? 129 00:06:03,200 --> 00:06:04,850 >> ALTAVEU 2: No s'atura allà. 130 00:06:04,850 --> 00:06:06,100 >> ALTAVEU 1: De debò? 131 00:06:06,100 --> 00:06:08,491