1 00:00:00,000 --> 00:00:07,270 2 00:00:07,270 --> 00:00:10,390 >> MARK Grozen-Smith: Cześć, jestem Mark Grozen-Smith, i jest Quicksort. 3 00:00:10,390 --> 00:00:13,520 Podobnie jak wstawiania rodzaju i bańki sortowania, Quicksort jest algorytm 4 00:00:13,520 --> 00:00:15,720 Sortowanie listy lub tablicę rzeczy. 5 00:00:15,720 --> 00:00:19,080 Dla uproszczenia załóżmy, że ci, rzeczy są tylko liczby całkowite, ale 6 00:00:19,080 --> 00:00:22,060 wiem, że Quicksort pracuje dla więcej niż tylko liczby. 7 00:00:22,060 --> 00:00:24,720 Szybki start jest nieco bardziej skomplikowana, niż wstawiania lub bańki, ale to 8 00:00:24,720 --> 00:00:27,560 znacznie bardziej skuteczna w większości przypadków. 9 00:00:27,560 --> 00:00:28,150 Chwileczkę. 10 00:00:28,150 --> 00:00:30,760 Czy on powiedział "najbardziej przypadków, "nie" wszystko "? 11 00:00:30,760 --> 00:00:31,710 Co ciekawe, nie. 12 00:00:31,710 --> 00:00:33,560 Nie we wszystkich przypadkach jest taka sama. 13 00:00:33,560 --> 00:00:36,650 Nie martw się o tym szczegółowo, jeśli ci Nie widziałem jeszcze duży notacji O, ale 14 00:00:36,650 --> 00:00:39,730 Quicksort jest O (n do kwadratu) algorytm w najgorszym wypadku, jak 15 00:00:39,730 --> 00:00:41,430 wstawiania lub sortowanie bąbelkowe. 16 00:00:41,430 --> 00:00:44,950 Jednakże, zwykle występuje znacznie więcej jak stary m algorytmu analogowego. 17 00:00:44,950 --> 00:00:45,750 Dlaczego? 18 00:00:45,750 --> 00:00:46,810 Wrócimy do tego później. 19 00:00:46,810 --> 00:00:49,610 Ale teraz, po prostu dowiedzieć się, jak Quicksort działa. 20 00:00:49,610 --> 00:00:53,080 >> Warto więc przejść przez Quicksorting to tablica liczb całkowitych z najmniejszą 21 00:00:53,080 --> 00:00:54,260 do największych. 22 00:00:54,260 --> 00:01:00,110 Tutaj mamy liczby całkowite 6, 5, 1, 3, 8, 4, 7, 9 i 2. 23 00:01:00,110 --> 00:01:03,480 Po pierwsze, możemy odebrać element końcowy Ta tablica - w tym przypadku, dwa - 24 00:01:03,480 --> 00:01:06,870 i zadzwonić, że "oś." Następnie, zacząć patrzeć na dwie rzeczy - 25 00:01:06,870 --> 00:01:10,220 jeden, najniższy wskaźnik, który będę odnosić jako pobytu na prawej 26 00:01:10,220 --> 00:01:13,970 ściana, i, dwa, od lewej elementem, który ja nazywam "prąd 27 00:01:13,970 --> 00:01:17,260 elementem. "Co mamy zamiar zrobić, to wyglądają wszystkie inne elementy, inne 28 00:01:17,260 --> 00:01:20,930 od osi obrotu, i umieścić wszystkie elementy mniejsze niż trzpienia do 29 00:01:20,930 --> 00:01:24,140 na lewo od ściany i wszystkich tych, większy od przegubu do 30 00:01:24,140 --> 00:01:25,570 prawej ściany. 31 00:01:25,570 --> 00:01:29,560 Wtedy wreszcie będziemy upuszczać pivot prawo na tej ścianie, aby umieścić go między 32 00:01:29,560 --> 00:01:32,970 wszystkie liczby mniejsze od niej oraz wszystkie liczby większe. 33 00:01:32,970 --> 00:01:34,460 >> Więc zróbmy to. 34 00:01:34,460 --> 00:01:38,540 Podnieść 2, umieścić w ścianę począwszy, i wywołać 6 "bieżący 35 00:01:38,540 --> 00:01:41,590 elementem. "Dlatego chcemy, aby spojrzeć na nasz bieżący element, 6. 36 00:01:41,590 --> 00:01:44,200 A ponieważ jest większy niż 2, zostawiamy go tam 37 00:01:44,200 --> 00:01:45,610 prawej ściany. 38 00:01:45,610 --> 00:01:48,980 Następnie przechodzimy do spojrzeć na 5, jak nasze bieżący element i zobaczyć, że to 39 00:01:48,980 --> 00:01:51,840 jest znowu większe od osi obrotu, tak, że zostawić je tam, gdzie jest po prawej stronie 40 00:01:51,840 --> 00:01:53,190 boczne ścianki. 41 00:01:53,190 --> 00:01:53,880 Ruszamy dalej. 42 00:01:53,880 --> 00:01:56,750 Nasza obecna elementem jest teraz 1, i - och. 43 00:01:56,750 --> 00:01:58,030 To jest teraz inna. 44 00:01:58,030 --> 00:02:00,890 Bieżący element jest mniejszy niż obrotu, więc chcemy go umieścić 45 00:02:00,890 --> 00:02:02,570 z lewej strony ścianie. 46 00:02:02,570 --> 00:02:06,555 Aby to zrobić, po prostu przełączyć Prąd element o najniższej liczbie 47 00:02:06,555 --> 00:02:07,970 Usytuowana na prawej ścianie. 48 00:02:07,970 --> 00:02:14,050 49 00:02:14,050 --> 00:02:17,570 Teraz przechodzimy do jednej ściany indeksu to 1 znajduje się po lewej 50 00:02:17,570 --> 00:02:19,750 strona teraz ściany. 51 00:02:19,750 --> 00:02:20,310 >> Czekać. 52 00:02:20,310 --> 00:02:23,450 Właśnie pomieszane elementy dotyczące prawej stronie ściany, prawda? 53 00:02:23,450 --> 00:02:23,890 Nie martw się. 54 00:02:23,890 --> 00:02:24,930 To dobrze. 55 00:02:24,930 --> 00:02:27,570 Jedyne, co nam zależy teraz jest to, że wszystkie te elementy do 56 00:02:27,570 --> 00:02:29,570 prawej ściany są większe od osi obrotu. 57 00:02:29,570 --> 00:02:31,760 Nie jest jednak rzeczywista kolejność zakłada. 58 00:02:31,760 --> 00:02:33,200 >> Wróćmy teraz do sortowania. 59 00:02:33,200 --> 00:02:35,840 Więc dalej, patrząc na Pozostałe elementy. 60 00:02:35,840 --> 00:02:39,075 I w tym przypadku widać, że istnieją żadne inne elementy poniżej 61 00:02:39,075 --> 00:02:42,100 obrotu, więc je wszystkie zostawić na prawej stronie ściany. 62 00:02:42,100 --> 00:02:45,980 Wreszcie docieramy do bieżącego elementu i zobaczyć, że jest obrotowy. 63 00:02:45,980 --> 00:02:48,830 Teraz, to znaczy, że mamy dwa fragmenty tablicy, pierwszej istoty 64 00:02:48,830 --> 00:02:51,820 znajdującą się na osi obrotu, a z lewej strony ściany, a druga jest 65 00:02:51,820 --> 00:02:54,500 większy od przegubu do prawej stronie ściany. 66 00:02:54,500 --> 00:02:57,040 Chcemy umieścić element obrotowy pomiędzy dwa, a potem będziemy wiedzieć 67 00:02:57,040 --> 00:03:01,000 że oś jest w prawo Ostateczna posortowane miejsce. 68 00:03:01,000 --> 00:03:04,980 Więc przejść do pierwszego elementu na prawej stronie ściany z osią, 69 00:03:04,980 --> 00:03:06,410 i wiemy obrotu jest w odpowiedniej pozycji. 70 00:03:06,410 --> 00:03:11,130 71 00:03:11,130 --> 00:03:15,650 >> Następnie powtórz tę czynność dla subarrays lewo i na prawo od osi obrotu. 72 00:03:15,650 --> 00:03:18,700 Ponieważ ostatnio subarray jest tylko jeden Element długo, wiemy, że to już 73 00:03:18,700 --> 00:03:22,480 sortowane, bo jak można być z zamawiać jeśli jesteś tylko jednym z elementów? 74 00:03:22,480 --> 00:03:28,860 Na prawej stronie subarray, że zobaczyć, że przegub jest 5, a ścianą 75 00:03:28,860 --> 00:03:32,250 jest po prostu na lewo od 6. 76 00:03:32,250 --> 00:03:34,970 I bieżący element również Zaczyna się jako 6. 77 00:03:34,970 --> 00:03:36,200 Tak więc 6 jest większa niż 5. 78 00:03:36,200 --> 00:03:38,590 Zostawiamy go, gdzie jest on prawej stronie ściany. 79 00:03:38,590 --> 00:03:41,060 Teraz, przechodząc, 3 jest mniejsza niż 5. 80 00:03:41,060 --> 00:03:44,160 Więc należy go z pierwszym elementem w sam raz na ścianę. 81 00:03:44,160 --> 00:03:47,944 82 00:03:47,944 --> 00:03:50,750 Teraz przeniósł się do jednej ściany. 83 00:03:50,750 --> 00:03:53,010 Teraz, przechodząc do 8. 84 00:03:53,010 --> 00:03:56,480 8 jest większa niż 5, i tak to zostawić. 85 00:03:56,480 --> 00:03:58,720 4 jest mniejsze niż 5, więc to przełącznik. 86 00:03:58,720 --> 00:04:02,950 87 00:04:02,950 --> 00:04:03,570 I na. 88 00:04:03,570 --> 00:04:04,820 I na. 89 00:04:04,820 --> 00:04:10,190 90 00:04:10,190 --> 00:04:13,670 >> Za każdym razem powtarzamy proces na lewej i prawej strony tablicy. my 91 00:04:13,670 --> 00:04:17,010 wybrać oś i robić porównań i utworzyć inny poziom w lewo i 92 00:04:17,010 --> 00:04:18,240 prawo subarrays. 93 00:04:18,240 --> 00:04:21,500 To wywołanie rekurencyjne potrwa do dotrzemy do końca, gdy mamy 94 00:04:21,500 --> 00:04:25,290 dzieli się na ogólnej tablicy zaledwie subarrays o długości 1. 95 00:04:25,290 --> 00:04:28,060 Stąd wiemy, że tablica jest posortowana ponieważ każdy element ma co 96 00:04:28,060 --> 00:04:29,330 pewnym momencie było obrotu. 97 00:04:29,330 --> 00:04:32,720 Innymi słowy, dla każdego elementu, numery do lewej są mniejsze 98 00:04:32,720 --> 00:04:36,420 Wartości i wszystkie Liczby rację mają większe wartości. 99 00:04:36,420 --> 00:04:38,980 >> Ta metoda działa bardzo dobrze, jeśli Wartość przegubu jest wybrana 100 00:04:38,980 --> 00:04:41,930 mniej więcej w połowie Zakres wartości listy. 101 00:04:41,930 --> 00:04:45,630 Oznaczałoby to, że po tym, jak poruszać elementy w okolicy, tam o tyle 102 00:04:45,630 --> 00:04:48,390 elementy do lewego czopa jak jest po prawej stronie. 103 00:04:48,390 --> 00:04:52,380 I charakter dziel i zwyciężaj z Algorytm quicksort jest następnie podjąć 104 00:04:52,380 --> 00:04:53,850 pełna zaletą. 105 00:04:53,850 --> 00:04:57,500 Stwarza to czas pracy O (n log n) n, ponieważ mamy do czynienia n minus 1 106 00:04:57,500 --> 00:05:01,640 porównania w każdym pokoleniu i dziennika n bo musimy podzielić listę 107 00:05:01,640 --> 00:05:03,210 log n razy. 108 00:05:03,210 --> 00:05:06,160 Jednakże, w najgorszych przypadkach Algorytm może faktycznie być O (n 109 00:05:06,160 --> 00:05:09,850 kwadratu.) Załóżmy na każdego pokolenia, obrotu tak dzieje się 110 00:05:09,850 --> 00:05:12,520 najmniejsza lub największa numery jesteśmy sortowania. 111 00:05:12,520 --> 00:05:15,870 To oznaczałoby rozbicie listę n razy i podejmowania n minus 1 112 00:05:15,870 --> 00:05:17,690 porównania za każdym razem. 113 00:05:17,690 --> 00:05:20,490 W ten sposób, o N kwadratu. 114 00:05:20,490 --> 00:05:22,000 >> Jak możemy udoskonalić metody? 115 00:05:22,000 --> 00:05:25,100 Dobrym sposobem, aby poprawić metody jest na celu zmniejszenie prawdopodobieństwa, że 116 00:05:25,100 --> 00:05:28,150 czas jest zawsze właściwie o n do kwadratu. 117 00:05:28,150 --> 00:05:31,860 Zapamiętaj ten najgorszy, najgorszy scenariusz może się zdarzyć, gdy tylko 118 00:05:31,860 --> 00:05:35,320 obrotu wybrany jest zawsze najwyższa lub Najniższa wartość w tablicy. 119 00:05:35,320 --> 00:05:38,630 W celu zapewnienia, jest to mniej prawdopodobne, możemy znaleźć pivot przez 120 00:05:38,630 --> 00:05:42,610 wyboru wielu elementów i przyjmując wartość średnią. 121 00:05:42,610 --> 00:05:44,650 >> Nazywam się Mark Grozen-Smith, i jest CS50. 122 00:05:44,650 --> 00:05:47,790 123 00:05:47,790 --> 00:05:50,930 >> Dla uproszczenia załóżmy, że ci, rzeczy są tylko liczby całkowite, ale 124 00:05:50,930 --> 00:05:51,970 wiedzieć, że Quicksert - 125 00:05:51,970 --> 00:05:53,160 Quicksert? 126 00:05:53,160 --> 00:05:55,200 Przepraszam. 127 00:05:55,200 --> 00:06:02,000 >> Tutaj mamy do liczb całkowitych 6, 5, 1, 3, 8, 4, 9. 128 00:06:02,000 --> 00:06:03,200 >> GŁOŚNIK 1: Naprawdę? 129 00:06:03,200 --> 00:06:04,850 >> Głośnik 2: Nie tylko. 130 00:06:04,850 --> 00:06:06,100 >> GŁOŚNIK 1: Naprawdę? 131 00:06:06,100 --> 00:06:08,491