Простой тестовый пример (игнорируйте заголовок, второй набор чисел должен быть последовательным, если сортировка двигателя стабильна).
Сорт IE был стабильным, когда-либо использовал его (так IE6). Проверка снова в IE8 и, похоже, все еще так.
И хотя эта страница Mozilla, на которую вы ссылаетесь, говорит, что сортировка Firefox стабильна, я определенно говорю, что это не всегда было до (и в том числе) Firefox 2.0.
Некоторые поверхностные результаты:
Все тесты в Windows.
См. Также:
Я хотел бы поделиться трюком, который я обычно использую в C / C ++ для qsort()
.
JS 'sort () позволяет указать функцию сравнения. Создайте второй массив той же длины и заполните его с увеличением числа от 0.
function stableSorted(array, compareFunction) {
compareFunction = compareFunction || defaultCompare;
var indicies = new Array(array.length);
for (var i = 0; i < indicies.length; i++)
indicies[i] = i;
Это индексы в исходном массиве. Мы собираемся отсортировать второй массив. Создайте пользовательскую функцию сравнения.
indicies.sort(function(a, b)) {
Он получит два элемента из второго массива: используйте их как индексы в исходных массивах и сравните элементы.
var aValue = array[a], bValue = array[b];
var order = compareFunction(a, b);
if (order != 0)
return order;
Если элементы оказались равными, сравните их индексы, чтобы сделать порядок стабильным.
if (a < b)
return -1;
else
return 1;
});
После sort () второй массив будет содержать индексы, которые вы можете использовать для доступа к элементам исходного массива в стабильном упорядоченном порядке.
var sorted = new Array(array.length);
for (var i = 0; i < sorted.length; i++)
sorted[i] = array[indicies[i]];
return sorted;
}
// The default comparison logic used by Array.sort(), if compareFunction is not provided:
function defaultCompare(a, b) {
a = String(a);
b = String(b);
if (a < b) return -1;
else if (a > b) return 1;
else return 0;
}
В общем, стабильные алгоритмы сортировки только созревают и по-прежнему требуют дополнительной дополнительной памяти по сравнению с хорошим QSort. Полагаю, именно поэтому очень немногие спецификации гарантируют стабильную сортировку.
Если вы ищете список браузеров, где вы должны использовать несерийный алгоритм сортировки, мое предложение не .
Вместо этого выполняйте проверку правильности сортировки, когда скрипт загружается и принимает ваше решение.
Поскольку спецификация не требует определенного поведения в этом отношении, она не защищена от позже изменения, даже в пределах той же линии браузера.
Вы можете отправить патч на http://www.browserscope.org/ , чтобы включить такие тесты в свой набор. Но опять же, обнаружение функций превосходит обнаружение браузера.