Podczas nauki w szkole średniej natknąłem się na wiele algorytmów sortowania. Jednak nigdy nie wiem, która jest najszybsza (dla losowej liczby całkowitej). Więc moje pytania to:
- Który jest najszybszym obecnie znanym algorytmem sortowania?
- Teoretycznie jest możliwe, że są jeszcze szybsze? Jaka jest najmniej złożoność sortowania?
Odpowiedzi:
Ogólnie rzecz biorąc, istnieją algorytmy sortowania , takie jak sortowanie wstawiane, sortowanie bąbelkowe i sortowanie selekcyjne, których zwykle powinieneś używać tylko w szczególnych okolicznościach; Quicksort, który jest najgorszym przypadkiem O ( n 2 ), ale dość często O ( n log n ) z dobrymi stałymi i właściwościami i który może być stosowany jako procedura sortowania ogólnego przeznaczenia; O ( n log n ) algorytmów, takich jak seryjnej-sortowania i sterty rodzaju, które są również dobre algorytmy ogólnego zastosowania do sortowania; i O ( nO(n2) O(n2) O(nlogn) O(nlogn) lub liniowe algorytmy sortowania dla list liczb całkowitych, takich jak podstawa, wiaderko i zliczanie, które mogą być odpowiednie w zależności od charakteru liczb całkowitych na twoich listach.O(n)
Jeśli elementy na liście są takie, że wszystko, co o nich wiesz, to łączna relacja między nimi, wówczas optymalne algorytmy sortowania będą miały złożoność . Jest to dość fajny wynik, dla którego powinieneś być w stanie łatwo znaleźć szczegóły w Internecie. Algorytmy liniowego sortowania wykorzystują dalsze informacje o strukturze elementów do sortowania, a nie tylko całkowitą relację kolejności między elementami.Ω(nlogn)
Mówiąc bardziej ogólnie, optymalność algorytmu sortowania zależy ściśle od założeń, jakie możesz poczynić na temat rodzaju list, które zamierzasz sortować (a także od modelu maszyny, na którym algorytm będzie działał, co może sprawić, że sortowanie w jeszcze inny sposób będzie złe algorytmy najlepszym wyborem; rozważ sortowanie bąbelkowe na maszynach z taśmą do przechowywania). Im silniejsze są twoje założenia, tym więcej algorytmów można wyciąć. Przy bardzo słabych założeniach dotyczących tego, jak skutecznie można określić „sortowanie” listy, optymalna złożoność najgorszego przypadku może nawet wynosić .Ω(n!)
Ta odpowiedź dotyczy tylko zawiłości. Rzeczywiste czasy działania implementacji algorytmów będą zależeć od dużej liczby czynników, które trudno jest uwzględnić w jednej odpowiedzi.
źródło
Odpowiedź, jak to często bywa w przypadku takich pytań, brzmi „to zależy”. Zależy to od (a) tego, jak duże są liczby całkowite, (b) czy tablica wejściowa zawiera liczby całkowite w losowej kolejności lub w prawie posortowanej kolejności, (c) czy potrzebujesz algorytmu sortowania, aby był stabilny, czy nie, a także inne czynniki, (d) czy cała lista liczb mieści się w pamięci (sortowanie w pamięci vs. sortowanie zewnętrzne), oraz (e) maszyna, na której ją uruchomisz.
W praktyce algorytm sortowania w standardowej bibliotece twojego języka będzie prawdopodobnie całkiem dobry (całkiem zbliżony do optymalnego), jeśli potrzebujesz sortowania w pamięci. Dlatego w praktyce wystarczy użyć dowolnej funkcji sortowania zapewnianej przez standardową bibliotekę i mierzyć czas działania. Tylko jeśli okaże się, że (i) sortowanie stanowi dużą część całkowitego czasu działania, oraz (ii) czas działania jest niedopuszczalny, powinieneś zawracać sobie głowę algorytmem sortowania. Jeśli te dwa warunki się utrzymują, możesz spojrzeć na określone aspekty konkretnej domeny i eksperymentować z innymi algorytmami szybkiego sortowania.
Ale realistycznie, w praktyce algorytm sortowania rzadko stanowi poważne wąskie gardło wydajności.
źródło
Ponadto, odpowiadając na twoje drugie pytanie
W przypadku sortowania ogólnego zastosowania złożoność problemu sortowania na podstawie porównania wynosi Ω (n log n) . Istnieje kilka algorytmów, które wykonują sortowanie w O (n), ale wszystkie opierają się na przyjmowaniu założeń dotyczących danych wejściowych i nie są algorytmami sortowania ogólnego przeznaczenia.
Zasadniczo złożoność wynika z minimalnej liczby porównań potrzebnych do sortowania tablicy (log n reprezentuje maksymalną wysokość binarnego drzewa decyzyjnego zbudowanego podczas porównywania każdego elementu tablicy).
Formalny dowód złożoności sortowania można znaleźć tutaj :
źródło
źródło
Przeczytałem pozostałe dwie odpowiedzi w momencie pisania tego i nie sądziłem, że żadna z nich odpowiednio odpowiedziała na twoje pytanie. Inne odpowiedzi dotyczyły obcych pomysłów na temat losowych rozkładów i złożoności przestrzeni, które prawdopodobnie nie wchodzą w zakres badań w szkole średniej. Oto moje zdanie.
źródło
źródło
źródło
Ponieważ nie wspominasz o żadnych ograniczeniach sprzętowych i ponieważ szukasz „najszybszego”, powiedziałbym, że powinieneś wybrać jeden z algorytmów sortowania równoległego w oparciu o dostępny sprzęt i rodzaj posiadanego wejścia.
W teorii np .
quick_sort
JestO(n log n)
. W przypadkup
procesorów idealnie powinno to sprowadzić się do tego,O(n/p log n)
jeśli uruchomimy go równolegle.Cytując Wikipedię: Złożoność czasowa ...
W praktyce w przypadku ogromnych rozmiarów danych wejściowych nie byłoby możliwe
O(log n)
ze względu na problemy ze skalowalnością.Oto pseudo kod dla sortowania korespondencji seryjnej . Implementacja
merge()
może być taka sama jak w normalnym sortowaniu scalającym:Zobacz także:
źródło