Реализация Javascript Array.sort?
Какой алгоритм использует функция JavaScript 9X_algorithm Array#sort()
? Я понимаю, что для выполнения различных 9X_sort видов сортировки могут потребоваться всевозможные 9X_ecmascript аргументы и функции, меня просто интересует, какой 9X_array-sorting алгоритм использует обычная сортировка.
- Это не указано в спецификации языка и зависит от реализации. Ответы в этой ветке (в настоящее время) очень устарели и / или относятся к конкретно ...
Ответ #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 ответе.)
Ответ #2
Ответ на вопрос: Реализация Javascript Array.sort?
Если вы посмотрите на эту ошибку 224128, окажется, что 9X_algorithm-design MergeSort используется Mozilla.
- Что ж, это также неправильно, потому что в нем указывается только алгоритм для конкретной реализации. Специфик ...
Ответ #3
Ответ на вопрос: Реализация Javascript Array.sort?
Для JS нет черновых требований для использования 9X_algorithm определенного алгоритма сортировки. Как 9X_bytearray здесь многие упоминали, Mozilla использует 9X_array сортировку слиянием. Однако в исходном коде 9X_sort Chrome v8 на сегодняшний день используются 9X_algorithm QuickSort и InsertionSort для меньших массивов.
По 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
- Я считаю, что 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() стабилен.
- ** Обновление: ** Последние версии 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.
- @JasonBunting, если функция реализована * и * выполняет то, что должна делать, как определено в спецификации, р ...
Ответ #6
Ответ на вопрос: Реализация Javascript Array.sort?
После некоторого дополнительного исследования 9X_bytearray выяснилось, что для Mozilla / Firefox Array.sort() использует 9X_.js сортировку слиянием. См. Код here.
- ссылка не работает<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.
-
3
-
5
-
2
-
5
-
5
-
9
-
5
-
3
-
2
-
14
-
1
-
5
-
5
-
4
-
2
-
7
-
3
-
4
-
5
-
4
-
2
-
2
-
5
-
4
-
2
-
4
-
6
-
12
-
9
-
15
-
3
-
6
-
3
-
9
-
7
-
8
-
4
-
24
-
15
-
10
-
8
-
9
-
14
-
9
-
3
-
15
-
14
-
11
-
7
-
10