Javascript Array.sort implementation?

Which algorithm does the JavaScript Array#sort() function use? I understand that it can take all manner of arguments and functions to perform different kinds of sorts, I’m simply interested in which algorithm the vanilla sort uses.

  • Are there any libraries for efficiently editing large strings in Javascript?
  • How can I modify this algorithm which reorders a <ul>?
  • Interconnected curved lines
  • What is the most efficient way to check for a sequence of numbers in a JavaScript array?
  • Explain how recursion works in an algorithm to determine depth of binary tree?
  • Rearrange Points that are too near to each other
  • Algorithm to create n-th level of nested patterns in RegEx
  • Best search algorithm in large array of objects with several fields
  • Chess game in JavaScript
  • Changing O(n^3) to O(n^2) in JavaScript
  • Finding number selection possibilities
  • Sorting common array of attributes
  • 6 Solutions collect form web for “Javascript Array.sort implementation?”

    If you look at this bug 224128, it appears that MergeSort is being used by Mozilla.

    I’ve just had a look at the WebKit (Chrome, Safari …) source. Depending on the type of array, different sort methods are used:

    Numeric arrays (or arrays of primitive type) are sorted using the C++ standard library function std::qsort which implements some variation of quicksort (usually introsort).

    Contiguous arrays of non-numeric type are stringified and sorted using mergesort, if available (to obtain a stable sorting) or qsort if no merge sort is available.

    For other types (non-contiguous arrays and presumably for associative arrays) WebKit uses either selection sort (which they call “min” sort) or, in some cases, it sorts via an AVL tree. Unfortunately, the documentation here is rather vague so you’d have to trace the code paths to actually see for which types which sort method is used.

    And then there are gems like 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).
    

    – Let’s just hope that whoever actually “fixes” this has a better understanding of asymptotic runtime than the writer of this comment, and realises that radix sort has a slightly more complex runtime description than simply O(N).

    (Thanks to phsource for pointing out the error in the original answer.)

    The ECMAscript standard does not specify which sort algorithm is to be used. Indeed, different browsers feature different sort algorithms. For example, Mozilla/Firefox’s sort() is not stable (in the sorting sense of the word) when sorting a map. IE’s sort() is stable.

    There is no draft requirement for JS to use a specific sorting algorthim. As many have mentioned here, Mozilla uses merge sort.However, In Chrome’s v8 source code, as of today, it uses QuickSort and InsertionSort, for smaller arrays.

    https://github.com/v8/v8/blob/master/src/js/array.js

    From Lines 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;
          }
        }
      };
    

    After some more research, it appears, for Mozilla/Firefox, that Array.sort() uses mergesort. See the code here.

    I think that would depend on what browser implementation you are refering to.

    Every browser type has it’s own javascript engine implementation, so it depends.
    You could check the sourcecode repos for Mozilla and Webkit/Khtml for different implementations.

    IE is closed source however, so you may have to ask somebody at microsoft.