Оптимизация этого двойного результата сравнения для сортировки в JavaScript - PullRequest
1 голос
/ 10 мая 2011

Обычно при сортировке вы делаете:

if (x < y) return -1
else if (x > y) return 1
else return 0

или

return ((x > y) ? 1 : ((x < y)) ? -1 : 0))

Два сравнения того, что кажется, можно выполнить только с одним. В сборке все, что вам нужно сделать, это вычесть оба в регистр, проверить, если отрицательно, проверить, если ноль. Проблема в JavaScript, если мы должны были вычесть:

var sub = (x - y);
return (sub == 0 ? 0 : ((sub < 0) ? -1 : 1))

В результате будет выполнено еще больше кода.

Итак, несколько вопросов:

  • Есть ли способ упростить или ускорить это в javascript?
  • Могут ли скомпилированные интерпретаторы javascript, такие как chrome, оптимизировать такое сравнение?
  • А как насчет других языков?

Ответы [ 3 ]

2 голосов
/ 10 мая 2011

В Javascript, sort не должен возвращать -1, 0 или 1. Может вернуть любое число. Это означает, что вам нужно только вычесть одно число из другого, чтобы сравнить их.

Документы MDC для Array.sort предлагают эту реализацию:

function compareNumbers(a, b)
{
  return a - b;
}

var nums = [34, 56, 1, 42, 63];
nums.sort(compareNumbers);
// [1, 34, 42, 56, 63]
1 голос
/ 10 мая 2011

сортировка по алфавиту может быть выполнена с помощью array.sort (), но если вы хотите сортировать по регистру unsensitive , вам нужно проверить, совпадают ли строки, или же одна из них больше или меньшеДругой.

array.sort(function(a,b){
  a=a.toLowerCase();
  b=b.toLowerCase();
  if(a==b) return 0;
  return a>b? 1:-1;
}

Беспокойство о дополнительном сравнении не имеет здесь никакого значения, преобразование в LowCase - это то, что съедает циклы.Поэтому не используйте toLowerCase, если вам это не нужно.

Числа, как было показано, просты -

array.sort(function(a,b){ return a-b});
1 голос
/ 10 мая 2011

Обычно алгоритм сортировки специально не ищет -1 или +1, просто <0 или> 0.Функция сравнения в этом случае может быть такой простой, как

return x - y ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...