Реализация Javascript Array.sort?

Какой алгоритм использует функция JavaScript 9X_algorithm Array#sort()? Я понимаю, что для выполнения различных 9X_sort видов сортировки могут потребоваться всевозможные 9X_ecmascript аргументы и функции, меня просто интересует, какой 9X_array-sorting алгоритм использует обычная сортировка.

293
1

  • Это не указано в спецификации языка и зависит от реализации. Ответы в этой ветке (в настоящее время) очень устарели и / или относятся к конкретно ...
7
Общее количество ответов: 7

Ответ #1

Ответ на вопрос: Реализация Javascript Array.sort?

Я только что взглянул на WebKit (Chrome, Safari…) source. В 9X_javascript-library зависимости от типа массива используются 9X_ecmascript разные методы сортировки:

Numeric arrays (или массивы примитивного 9X_algorithm типа) сортируются с помощью стандартной 9X_algorithm библиотечной функции C++ std::qsort, которая реализует 9X_arrays некоторые варианты быстрой сортировки (обычно 9X_sorting introsort).

Contiguous arrays of non-numeric type преобразовываются в строки и сортируются 9X_javascript с использованием сортировки слиянием, если 9X_jsonarray она доступна (для получения стабильной сортировки), или 9X_ecmascript qsort, если сортировка слиянием недоступна.

Для 9X_array-sorting других типов (несмежные массивы и, предположительно, для 9X_bytearray ассоциативных массивов) WebKit использует 9X_jsonarray либо selection sort (который они называют “min” sort), либо, в некоторых 9X_algorithm случаях, сортировку через дерево AVL. К 9X_.js сожалению, документация здесь довольно расплывчата, поэтому 9X_javascript вам придется отслеживать пути кода, чтобы 9X_array увидеть, для каких типов используется какой 9X_sorted метод сортировки.

А еще есть жемчужины вроде 9X_.js this comment:

// FIXME: Since we sort by string value, a fast algorithm might be to use a // radix sort. That would be O(N) rather than O(N log N). 

- Будем надеяться, что тот, кто на самом 9X_algorithms деле «исправляет» это, лучше понимает асимптотику 9X_.js времени выполнения, чем автор этого комментария, и 9X_javascript-library понимает, что radix sort has a slightly more complex runtime description, чем просто O (N).

(Спасибо 9X_algorithm-design phsource за указание на ошибку в исходном 9X_jsonarray ответе.)

354
0

Ответ #2

Ответ на вопрос: Реализация Javascript Array.sort?

Если вы посмотрите на эту ошибку 224128, окажется, что 9X_algorithm-design MergeSort используется Mozilla.

78
1

  • Что ж, это также неправильно, потому что в нем указывается только алгоритм для конкретной реализации. Специфик ...

Ответ #3

Ответ на вопрос: Реализация Javascript Array.sort?

Для JS нет черновых требований для использования 9X_algorithm определенного алгоритма сортировки. Как 9X_bytearray здесь многие упоминали, Mozilla использует 9X_array сортировку слиянием. Однако в исходном коде 9X_sort Chrome v8 на сегодняшний день используются 9X_algorithm QuickSort и InsertionSort для меньших массивов.

V8 Engine Source

По 9X_sort строкам 807–891

 var QuickSort = function QuickSort(a, from, to) { var third_index = 0; while (true) { // Insertion sort is faster for short arrays. if (to - from <= 10) { InsertionSort(a, from, to); return; } if (to - from > 1000) { third_index = GetThirdIndex(a, from, to); } else { third_index = from + ((to - from) >> 1); } // Find a pivot as the median of first, last and middle element. var v0 = a[from]; var v1 = a[to - 1]; var v2 = a[third_index]; var c01 = comparefn(v0, v1); if (c01 > 0) { // v1 < v0, so swap them. var tmp = v0; v0 = v1; v1 = tmp; } // v0 <= v1. var c02 = comparefn(v0, v2); if (c02 >= 0) { // v2 <= v0 <= v1. var tmp = v0; v0 = v2; v2 = v1; v1 = tmp; } else { // v0 <= v1 && v0 < v2 var c12 = comparefn(v1, v2); if (c12 > 0) { // v0 <= v2 < v1 var tmp = v1; v1 = v2; v2 = tmp; } } // v0 <= v1 <= v2 a[from] = v0; a[to - 1] = v2; var pivot = v1; var low_end = from + 1; // Upper bound of elements lower than pivot. var high_start = to - 1; // Lower bound of elements greater than pivot. a[third_index] = a[low_end]; a[low_end] = pivot; // From low_end to i are elements equal to pivot. // From i to high_start are elements that haven't been compared yet. partition: for (var i = low_end + 1; i < high_start; i++) { var element = a[i]; var order = comparefn(element, pivot); if (order < 0) { a[i] = a[low_end]; a[low_end] = element; low_end++; } else if (order > 0) { do { high_start--; if (high_start == i) break partition; var top_elem = a[high_start]; order = comparefn(top_elem, pivot); } while (order > 0); a[i] = a[high_start]; a[high_start] = element; if (order < 0) { element = a[i]; a[i] = a[low_end]; a[low_end] = element; low_end++; } } } if (to - high_start < low_end - from) { QuickSort(a, high_start, to); to = low_end; } else { QuickSort(a, from, low_end); from = high_start; } } }; 

Обновить По состоянию на 2018 год 9X_sorting V8 использует TimSort, спасибо @celwell. Source

63
1

  • Я считаю, что V8 теперь использует TimSort: https://github.com/v8/v8/blob/78f2610345fdd14ca401d920c140f8f461b631d1/third_party/v8/builtins/array- ...

Ответ #4

Ответ на вопрос: Реализация Javascript Array.sort?

Стандарт ECMAscript не определяет, какой 9X_algorithm алгоритм сортировки следует использовать. Действительно, разные 9X_javascript браузеры имеют разные алгоритмы сортировки. Например, sort() Mozilla 9X_ecmascript / Firefox не является stable (в смысле сортировки 9X_array-sorting этого слова) при сортировке карты. IE sort() стабилен.

27
2

  • ** Обновление: ** Последние версии Firefox имеют стабильный файл `Array.sort`; см. [этот вопрос] (ht ...

Ответ #5

Ответ на вопрос: Реализация Javascript Array.sort?

Я думаю, это будет зависеть от реализации 9X_algorithms вашего браузера.

У каждого типа браузера 9X_javascript есть своя собственная реализация движка 9X_algorithms javascript, так что это зависит. Вы можете 9X_algorithm проверить репозитории исходного кода для 9X_arrays Mozilla и Webkit / Khtml на предмет различных 9X_array реализаций.

IE имеет закрытый исходный код, поэтому 9X_algorithms вам, возможно, придется спросить кого-нибудь 9X_sort в Microsoft.

9
1

  • @JasonBunting, если функция реализована * и * выполняет то, что должна делать, как определено в спецификации, р ...

Ответ #6

Ответ на вопрос: Реализация Javascript Array.sort?

После некоторого дополнительного исследования 9X_bytearray выяснилось, что для Mozilla / Firefox Array.sort() использует 9X_.js сортировку слиянием. См. Код here.

9
1

  • ссылка не работает<p><spa ...

Ответ #7

Ответ на вопрос: Реализация Javascript Array.sort?

Начиная с V8 v7.0 / Chrome 70, V8 использует 9X_array-sorting TimSort, алгоритм сортировки Python. Chrome 70 9X_array был выпущен 13 сентября 2018 г.

Подробную 9X_bytearray информацию об этом изменении см. в the post on the V8 dev blog. Вы 9X_array также можете прочитать source code или patch 1186801.

9
0