1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARK Grozen-SMITH: Hallo, ich bin Mark Grozen-Smith, und dies ist Quicksort. 3 00:00:10,390 --> 00:00:13,520 Genau wie Insertion Sort und Bubble Sortieren, Quicksort ist ein Algorithmus zur 4 00:00:13,520 --> 00:00:15,720 Sortieren einer Liste oder eine Reihe von Dingen. 5 00:00:15,720 --> 00:00:19,080 Der Einfachheit halber nehmen wir an, dass diejenigen, Dinge sind nur ganze Zahlen, aber 6 00:00:19,080 --> 00:00:22,060 wissen, dass Quicksort arbeitet für mehr als nur Zahlen. 7 00:00:22,060 --> 00:00:24,720 Quickstart ist ein bisschen komplizierter als Ein-oder Luftblase, aber es ist 8 00:00:24,720 --> 00:00:27,560 auch wesentlich effizienter in den meisten Fällen. 9 00:00:27,560 --> 00:00:28,150 Warten Sie eine Sekunde. 10 00:00:28,150 --> 00:00:30,760 Hat er nur "die meisten sagen, Fällen ", nicht" alle "? 11 00:00:30,760 --> 00:00:31,710 Interessanterweise nicht. 12 00:00:31,710 --> 00:00:33,560 Nicht in allen Fällen die gleichen sind. 13 00:00:33,560 --> 00:00:36,650 Sie nicht über dieses Detail kümmern, wenn Sie nicht O-Notation noch nicht gesehen, aber 14 00:00:36,650 --> 00:00:39,730 Quicksort ist ein O (n-Quadrat)-Algorithmus im schlimmsten Fall, wie 15 00:00:39,730 --> 00:00:41,430 Ein-oder Bubble-Sort. 16 00:00:41,430 --> 00:00:44,950 Allerdings handelt es typischerweise viel mehr wie eine alte analoge m-Algorithmus. 17 00:00:44,950 --> 00:00:45,750 Warum? 18 00:00:45,750 --> 00:00:46,810 Wir kommen wieder zu bekommen, dass später. 19 00:00:46,810 --> 00:00:49,610 Aber jetzt wollen wir nur lernen wie Quicksort funktioniert. 20 00:00:49,610 --> 00:00:53,080 >> Lassen Sie uns also über diese Quicksorting gehen Array von ganzen Zahlen von der kleinsten 21 00:00:53,080 --> 00:00:54,260 zum größten. 22 00:00:54,260 --> 00:01:00,110 Hier haben wir die Zahlen 6, 5, 1, 3, 8, 4, 7, 9 und 2. 23 00:01:00,110 --> 00:01:03,480 Zuerst wählen wir das letzte Element der dieses Array - in diesem Fall zwei - 24 00:01:03,480 --> 00:01:06,870 und rufen, dass die "Pivot". Als nächstes wir beginnen, an zwei Dinge sehen - 25 00:01:06,870 --> 00:01:10,220 ein, dem niedrigsten Index, der ich entnehmen so bleiben rechts 26 00:01:10,220 --> 00:01:13,970 die Wand, und zwei, die am weitesten links Element, das ich die "aktuelle nennen 27 00:01:13,970 --> 00:01:17,260 Element. "Was wir tun werden, ist schauen alle anderen Elemente, andere 28 00:01:17,260 --> 00:01:20,930 als die Dreh, und legte all die Elemente kleiner ist als der Schwenk die 29 00:01:20,930 --> 00:01:24,140 links von der Wand und alle, größer als der Schwenk die 30 00:01:24,140 --> 00:01:25,570 rechts von der Wand. 31 00:01:25,570 --> 00:01:29,560 Dann, endlich, wir werden die Dreh Drop direkt auf die Wand, um sie zwischen setzen 32 00:01:29,560 --> 00:01:32,970 alle Zahlen kleiner als und alle Zahlen größer. 33 00:01:32,970 --> 00:01:34,460 >> Also lassen Sie uns das tun. 34 00:01:34,460 --> 00:01:38,540 Nehmen Sie die 2, legen Sie die Wand in die Anfang, und rufen Sie die 6 den "aktuellen 35 00:01:38,540 --> 00:01:41,590 Element. "So wollen wir zu sehen unsere aktuellen Element, der 6. 36 00:01:41,590 --> 00:01:44,200 Und da es größer als die 2, lassen wir es dort zu den 37 00:01:44,200 --> 00:01:45,610 rechts von der Wand. 38 00:01:45,610 --> 00:01:48,980 Dann bewegen wir uns auf in der 5 aussehen wie unsere aktuelle Element und sehen, dass diese 39 00:01:48,980 --> 00:01:51,840 ist wiederum größer als der Schwenk, deswegen lassen, wo es ist auf der rechten 40 00:01:51,840 --> 00:01:53,190 Seite der Wand. 41 00:01:53,190 --> 00:01:53,880 Wir ziehen weiter. 42 00:01:53,880 --> 00:01:56,750 Unsere aktuelle Element Jetzt 1 und - oh. 43 00:01:56,750 --> 00:01:58,030 Das ist jetzt anders. 44 00:01:58,030 --> 00:02:00,890 Das aktuelle Element ist jetzt kleiner als der Dreh, so wollen es uns 45 00:02:00,890 --> 00:02:02,570 auf der linken Seite der Wand. 46 00:02:02,570 --> 00:02:06,555 Um dies zu tun, lass uns einfach wechseln die aktuelle Element mit dem niedrigsten Index 47 00:02:06,555 --> 00:02:07,970 sitzt nur auf der rechten Seite der Wand. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 Nun, die Wand bis ein Index bewegen wir uns so dass der 1 auf der linken Seite 50 00:02:17,570 --> 00:02:19,750 Seite jetzt der Wand. 51 00:02:19,750 --> 00:02:20,310 >> Warten. 52 00:02:20,310 --> 00:02:23,450 Ich habe gerade die Elemente auf die gemischt rechten Seite der Wand, oder nicht? 53 00:02:23,450 --> 00:02:23,890 Mach dir keine Sorgen. 54 00:02:23,890 --> 00:02:24,930 Das ist in Ordnung. 55 00:02:24,930 --> 00:02:27,570 Das einzige, was wir interessieren uns für jetzt ist, dass alle diese Elemente in der 56 00:02:27,570 --> 00:02:29,570 rechts von der Wand sind größer als der Drehpunkt. 57 00:02:29,570 --> 00:02:31,760 Keine tatsächliche Reihenfolge wird noch angenommen. 58 00:02:31,760 --> 00:02:33,200 >> Nun, zurück zu sortieren. 59 00:02:33,200 --> 00:02:35,840 Also wir suchen weiter der Rest der Elemente. 60 00:02:35,840 --> 00:02:39,075 Und in diesem Fall sieht man, dass es keine weiteren Elemente weniger als die 61 00:02:39,075 --> 00:02:42,100 Pivot, sie alle so weiter verlassen wir die rechte Seite der Wand. 62 00:02:42,100 --> 00:02:45,980 Schließlich, um das aktuelle Element erhalten wir und dass es die Schwenk. 63 00:02:45,980 --> 00:02:48,830 Nun bedeutet, dass wir zwei haben Abschnitte der Anordnung, wobei die erste 64 00:02:48,830 --> 00:02:51,820 klein auf dem Drehzapfen und auf der linken Seite von der Wand und dem zweiten Wesen 65 00:02:51,820 --> 00:02:54,500 größer als der Schwenk die rechten Seite der Wand. 66 00:02:54,500 --> 00:02:57,040 Wir wollen das Drehelement zwischen setzen die beiden, und dann werden wir wissen, 67 00:02:57,040 --> 00:03:01,000 daß die Schwenk in seiner richtigen Abschluss sortierten Ort. 68 00:03:01,000 --> 00:03:04,980 So schalten wir das erste Element auf der rechten Seite der Wand mit der Schwenk, 69 00:03:04,980 --> 00:03:06,410 und wir wissen, ist die Schwenk in der rechten Position. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> Dann wiederholen wir diesen Vorgang für die Teilfelder links und rechts des Schwenk. 72 00:03:15,650 --> 00:03:18,700 Seit der letzten Unterfeld ist nur ein Element lange wissen wir, dass es schon 73 00:03:18,700 --> 00:03:22,480 sortierten denn wie kann man aus sein bestellen, wenn Sie nur ein Element sind? 74 00:03:22,480 --> 00:03:28,860 Für die rechte Seite des Sub-Array, wir sehen, dass die Dreh ist 5 und die Wand 75 00:03:28,860 --> 00:03:32,250 ist nur der 6 übrig. 76 00:03:32,250 --> 00:03:34,970 Und auch das aktuelle Element startet als 6. 77 00:03:34,970 --> 00:03:36,200 So 6 größer als 5 ist. 78 00:03:36,200 --> 00:03:38,590 Wir überlassen es wo es auf die rechten Seite der Wand. 79 00:03:38,590 --> 00:03:41,060 Nun fortfahren, 3 kleiner als 5 ist. 80 00:03:41,060 --> 00:03:44,160 So schalten wir es mit dem ersten Element nur rechts von der Wand. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 Nun zog ich die Wand nach oben ein. 83 00:03:50,750 --> 00:03:53,010 Nun bewegt auf den 8. 84 00:03:53,010 --> 00:03:56,480 8 ist größer als 5, und so lassen wir es. 85 00:03:56,480 --> 00:03:58,720 Die 4 ist kleiner als 5, so dass wir sie umschalten. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 Und an. 88 00:04:03,570 --> 00:04:04,820 Und an. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> Jedes Mal, wenn wir uns wiederholen Sie den Vorgang auf der linken und rechten Seite der Anordnung. wir 91 00:04:13,670 --> 00:04:17,010 wählen Sie einen Drehpunkt und machen die Vergleiche und erstellen Sie eine weitere Ebene der links und 92 00:04:17,010 --> 00:04:18,240 rechten Untergruppen. 93 00:04:18,240 --> 00:04:21,500 Diese rekursiven Aufruf wird bis weiter wir das Ende erreichen, wenn wir haben 94 00:04:21,500 --> 00:04:25,290 die Gesamt Array aufgeteilt in nur Sub-Arrays der Länge 1. 95 00:04:25,290 --> 00:04:28,060 Von dort wissen wir, das Array sortiert da jedes Element zumin 96 00:04:28,060 --> 00:04:29,330 Irgendwann, ein Drehpunkt. 97 00:04:29,330 --> 00:04:32,720 Mit anderen Worten, für jedes Element, die alle Die Zahlen auf der linken Seite sind geringere 98 00:04:32,720 --> 00:04:36,420 Werte und alle Zahlen auf die Recht haben größere Werte. 99 00:04:36,420 --> 00:04:38,980 >> Diese Methode funktioniert sehr gut, wenn die Wert der gewählten Dreh ist 100 00:04:38,980 --> 00:04:41,930 etwa in der Mitte Bereich der Listenwerte. 101 00:04:41,930 --> 00:04:45,630 Dies würde bedeuten, dass nach dem wir uns bewegen Elemente herum, es etwa so viele 102 00:04:45,630 --> 00:04:48,390 Elemente auf der linken Seite des Schwenk wie es auf der rechten Seite. 103 00:04:48,390 --> 00:04:52,380 Und die Teile-und-Herrsche-Natur der Quicksort-Algorithmus wird dann genommen 104 00:04:52,380 --> 00:04:53,850 vollen Nutzen aus. 105 00:04:53,850 --> 00:04:57,500 Dies schafft eine Laufzeit von O (n log n) die n, weil wir zu tun haben, n minus 1 106 00:04:57,500 --> 00:05:01,640 Vergleiche, die auf jeder Generation und Protokoll n, denn wir haben, um die Liste zu teilen 107 00:05:01,640 --> 00:05:03,210 log n mal. 108 00:05:03,210 --> 00:05:06,160 In den schlimmsten Fällen, diese Algorithmus tatsächlich sein kann O (n 109 00:05:06,160 --> 00:05:09,850 Quadrat.) Angenommen auf jeder Generation der Dreh passiert einfach so zu sein das 110 00:05:09,850 --> 00:05:12,520 kleinste oder der größte der Zahlen wir Sortierung. 111 00:05:12,520 --> 00:05:15,870 Dies würde bedeuten, den Abbau der Liste n-mal und machen n minus 1 112 00:05:15,870 --> 00:05:17,690 Vergleiche jede einzelne Zeit. 113 00:05:17,690 --> 00:05:20,490 So o n quadriert. 114 00:05:20,490 --> 00:05:22,000 >> Wie können wir die Methode? 115 00:05:22,000 --> 00:05:25,100 Eine gute Möglichkeit, um das Verfahren zu verbessern, ist um auf die Wahrscheinlichkeit reduzieren, dass 116 00:05:25,100 --> 00:05:28,150 die Laufzeit ist eigentlich immer o n quadriert. 117 00:05:28,150 --> 00:05:31,860 Merken schlimmsten schlimmsten Fall kann nur geschehen, wenn die 118 00:05:31,860 --> 00:05:35,320 Dreh gewählt ist immer die höchste oder niedrigsten Wert im Array. 119 00:05:35,320 --> 00:05:38,630 Um dies zu gewährleisten ist es weniger wahrscheinlich passieren, können wir die Dreh durch finden 120 00:05:38,630 --> 00:05:42,610 Auswahl mehrerer Elemente und unter dem Medianwert. 121 00:05:42,610 --> 00:05:44,650 >> Mein Name ist Mark Grozen-Smith, und dies ist CS50. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> Der Einfachheit halber nehmen wir an, dass diejenigen, Dinge sind nur ganze Zahlen, aber 124 00:05:50,930 --> 00:05:51,970 wissen, dass QUICKSERT - 125 00:05:51,970 --> 00:05:53,160 QUICKSERT? 126 00:05:53,160 --> 00:05:55,200 Entschuldigung. 127 00:05:55,200 --> 00:06:02,000 >> Hier haben wir die ganzen Zahlen 6, 5, 1, 3, 8, 4, 9. 128 00:06:02,000 --> 00:06:03,200 >> Sprecher 1: Wirklich? 129 00:06:03,200 --> 00:06:04,850 >> Sprecher 2: Hören Sie nicht dort. 130 00:06:04,850 --> 00:06:06,100 >> Sprecher 1: Wirklich? 131 00:06:06,100 --> 00:06:08,491