непредвиденное поведение, пользовательский .sort () с возвратом всегда 0 [duplicate]

57
задан Boushley 11 June 2010 в 22:59
поделиться

3 ответа

Простой тестовый пример (игнорируйте заголовок, второй набор чисел должен быть последовательным, если сортировка двигателя стабильна).

Сорт IE был стабильным, когда-либо использовал его (так IE6). Проверка снова в IE8 и, похоже, все еще так.

И хотя эта страница Mozilla, на которую вы ссылаетесь, говорит, что сортировка Firefox стабильна, я определенно говорю, что это не всегда было до (и в том числе) Firefox 2.0.

Некоторые поверхностные результаты:

  • IE6 +: стабильный
  • Firefox & lt; 3: неустойчивый
  • Firefox> = 3: stable
  • Chrome & lt; = 5 (т. Е. Все версии на сегодняшний день): нестабильный
  • Opera & lt; 10: неустойчивый
  • Opera> = 10: stable
  • Safari 4: stable

Все тесты в Windows.

См. Также:

53
ответ дан Community 31 August 2018 в 11:22
поделиться

Я хотел бы поделиться трюком, который я обычно использую в 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. Полагаю, именно поэтому очень немногие спецификации гарантируют стабильную сортировку.

13
ответ дан Jeremy 31 August 2018 в 11:22
поделиться

Если вы ищете список браузеров, где вы должны использовать несерийный алгоритм сортировки, мое предложение не .

Вместо этого выполняйте проверку правильности сортировки, когда скрипт загружается и принимает ваше решение.

Поскольку спецификация не требует определенного поведения в этом отношении, она не защищена от позже изменения, даже в пределах той же линии браузера.

Вы можете отправить патч на http://www.browserscope.org/ , чтобы включить такие тесты в свой набор. Но опять же, обнаружение функций превосходит обнаружение браузера.

-2
ответ дан unomi 31 August 2018 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: