porównanie algorytmów sortowania

algorytmy sortowania są ważną częścią zarządzania danymi . AtCprogramming.com, oferujemy tutoriale do zrozumienia najważniejszych i wspólnych technik. Każdy algorytm ma szczególne atuty iwymagania, a w wielu przypadkach najlepszą rzeczą do zrobienia jest po prostu użycie wbudowanej funkcji wstawiania qsort. W czasach, gdy nie jest to opcja lub po prostu potrzebujeszszybki i brudny algorytm sortowania, istnieje wiele opcji.

większość algorytmów sortowania działa poprzez porównywanie sortowanych danych. W niektórych przypadkach może być pożądane sortowanie dużej części danych (na przykład astruct zawierający nazwę i adres) na podstawie tylko części tych danych.Część danych faktycznie użyta do określenia posortowanej kolejności nazywa się kluczem.
algorytmy sortowania są zwykle oceniane na podstawie ich skuteczności. W tym przypadku efektywność odnosi się do wydajności algorytmicznej, ponieważ wielkość danych wejściowych rośnie i jest na ogół oparta na liczbie elementów do sortowania. Większość używanych algorytmów ma wydajność algorytmiczną O (N^2) Lubo (n * log (N)). Kilka specjalnych algorytmów przypadków (jeden przykład jest wymieniony w programie perły) może sortować określone zbiory danych szybciej niż O(N*log(N)). Teealgorithmy nie opierają się na porównywaniu posortowanych pozycji i polegają na Wykazano, że żaden algorytm porównywania kluczy nie może działać lepiej niż O(N*log(N)).
wiele algorytmów, które mają taką samą wydajność, nie ma tej samej prędkości na tym samym wejściu. Po pierwsze, algorytmy muszą być oceniane na podstawie ich średniego przypadku,najlepszego przypadku i najgorszej wydajności. Niektóre algorytmy,takie jak szybkie sortowanie, działają wyjątkowo dobrze dla niektórych danych wejściowych, ale okropnie dla innych. Inne algorytmy, takie jak Merge sort, nie mają wpływu na kolejność danych wejściowych.Nawet zmodyfikowana wersja bubble sort może zakończyć się w O (n) dla najbardziej korzystnych wejść.
drugim czynnikiem jest „termin stały”. Ponieważ notacja big-O abstrahuje od wielu szczegółów procesu, jest bardzo przydatna do spojrzenia na bigpicture. Ale jedną rzeczą, która zostaje pominięta, jest stała przed wyrażeniem: na przykład O(c*n) jest po prostu O (n). W realnym świecie, C będzie się różnić w zależności od algorytmów. Dobrze zaimplementowany quicksort powinien mieć znacznie mniejszy stały mnożnik niż heap sort.
drugim kryterium oceny algorytmów jest ich Wymaganie przestrzeni — czy wymagają one miejsca na scratch, czy może tablica może być posortowana na miejscu (bez dodatkowej pamięci poza kilkoma zmiennymi)? Niektóre algorytmy nigdy nie wymagają przestrzeni extra, podczas gdy niektóre są najłatwiej zrozumiałe, gdy są implementowane z przestrzenią Extra (na przykład sortowanie sterty może być wykonane na miejscu, ale koncepcyjnie znacznie łatwiej jest myśleć o oddzielnej stercie). Wymagania dotyczące miejsca mogą się równać z zastosowaną strukturą danych(np. sortowanie scalające na tablicach, a sortowanie scalające na listach połączonych).
trzecim kryterium jest stabilność-czy sortowanie zachowuje kolejność kluczy o równych wartościach? Większość prostych gatunków właśnie to robi, ale niektóre rodzaje, takie jak rodzaj ślimaka, nie robią tego.
Poniższy wykres porównuje algorytmy sortowania według różnych kryteriów podanych powyżej; algorytmy o wyższych wartościach stałych pojawiają się jako pierwsze, choć jest to oczywiście koncepcja zależna od implementacji i powinna być jedynie przybliżonym przewodnikiem przy wyborze między rodzajami o tej samej wydajności big-O.

Time
Sort Average Best Worst Space Stability Remarks
Bubble sort O(n^2) O(n^2) O(n^2) Constant Stable Always use a modified bubble sort
Modified Bubble sort O(n^2) O(n) O(n^2) Constant Stable Stops after reaching a sorted array
Selection Sort O(n^2) O(n^2) O(n^2) stała stabilna nawet idealnie posortowane wejście wymaga skanowania całej tablicy
sortowanie wstawiania O(n^2) O(n) O(n^2) stała stabilna w najlepszym przypadku (już posortowana) każda wstawka wymaga stałego czasu
sortowanie sterty o(n*log(n)) o(n*log(N)) stała /td> niestabilny używając tablicy wejściowej jako pamięci sterty, możliwe jest uzyskanie stałej przestrzeni
Merge Sort O(N*log(n)) O(n*log(n)) O(n*log(n)) zależy stabilny na połączonych listach sortowanie scalające wymaga stałej przestrzeni
Quicksort o(n*log(n)) o(n*log(n)) O(n^2) stała stabilna losowe wybieranie wartości obrotu(lub tasowanie tablicy przed sortowaniem) może pomóc uniknąć najgorszych scenariuszy, takich jak idealnie posortowana tablica.



Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.