Реализация 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