Z jakiego algorytmu Array#sort()
korzysta funkcja JavaScript ? Rozumiem, że wykonywanie różnego rodzaju argumentów może wymagać wielu argumentów i funkcji, po prostu interesuje mnie, jakiego algorytmu używa sortowanie waniliowe.
javascript
algorithm
arrays
sorting
latortuga
źródło
źródło
Odpowiedzi:
Jeśli spojrzysz na ten błąd 224128 , wygląda na to , że Mozilla używa MergeSort.
źródło
Właśnie obejrzałem źródło WebKit (Chrome, Safari…) . W zależności od rodzaju tablicy stosowane są różne metody sortowania:
Tablice numeryczne (lub tablice typu pierwotnego) są sortowane przy użyciu standardowej funkcji bibliotecznej C ++,
std::qsort
która implementuje pewną odmianę szybkiego sortowania (zwykle wewnątrz sortowania ).Przylegające tablice nieliczbowego typu są uszeregowane i sortowane przy użyciu funkcji scalesort, jeśli są dostępne (w celu uzyskania stabilnego sortowania) lub
qsort
jeśli nie jest dostępne sortowanie metodą scalania.W przypadku innych typów (tablic niesąsiadujących i przypuszczalnie w przypadku tablic asocjacyjnych) WebKit używa sortowania selekcyjnego (które nazywają sortowaniem „min” ) lub, w niektórych przypadkach, sortuje za pomocą drzewa AVL. Niestety, dokumentacja tutaj jest raczej niejasna, więc trzeba by prześledzić ścieżki kodu, aby zobaczyć, dla których typów jest używana metoda sortowania.
A potem są klejnoty takie jak ten komentarz :
- Miejmy tylko nadzieję, że ktokolwiek „naprawi” to, lepiej rozumie asymptotyczne środowisko wykonawcze niż autor tego komentarza i zdaje sobie sprawę, że sortowanie radix ma nieco bardziej złożony opis środowiska wykonawczego niż po prostu O (N).
(Podziękowania dla phsource za wskazanie błędu w oryginalnej odpowiedzi.)
źródło
JS nie ma wstępnego wymogu używania określonego algorytmu sortowania. Jak wielu wspomniało tutaj, Mozilla używa sortowania korespondencji seryjnej, jednak w kodzie źródłowym Chrome v8 na dzień dzisiejszy używa QuickSort i InsertionSort, dla mniejszych tablic.
Źródło silnika V8
Z linii 807–891
Aktualizacja Od 2018 roku V8 używa TimSort, dzięki @celwell. Źródło
źródło
Standard ECMAscript nie określa, który algorytm sortowania należy zastosować. Rzeczywiście, różne przeglądarki mają różne algorytmy sortowania. Na przykład metoda sort () Mozilla / Firefox nie jest stabilna (w sensie sortowania tego słowa) podczas sortowania mapy. IE sort () jest stabilny.
źródło
Array.sort
; zobacz to pytanie .Po dalszych badaniach okazało się, że w przypadku Mozilla / Firefox Array.sort () używa scalesort. Zobacz kod tutaj .
źródło
Myślę, że to zależy od implementacji przeglądarki, o której mowa.
Każdy typ przeglądarki ma własną implementację silnika javascript, więc to zależy. Możesz sprawdzić repozytorium kodu źródłowego dla Mozilli i Webkit / Khtml dla różnych implementacji.
IE jest jednak źródłem zamkniętym, więc być może będziesz musiał zapytać kogoś w Microsoft.
źródło
Począwszy od wersji V8 7.0 / Chrome 70, wersja V8 używa TimSort , algorytmu sortowania Pythona. Chrome 70 został wydany 13 września 2018 r.
Zobacz post na blogu deweloperów V8, aby uzyskać szczegółowe informacje na temat tej zmiany. Możesz także odczytać kod źródłowy lub poprawkę 1186801 .
źródło
Funkcja Array.sort () JavaScript ma wewnętrzne mechanizmy wyboru najlepszego algorytmu sortowania (QuickSort, MergeSort itp.) Na podstawie typu danych elementów tablicy.
źródło
spróbuj tego z szybkim sortowaniem:
źródło