Как добавить банку во Внешние библиотеки в андроид студии

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

143
задан Ishaan Javali 7 January 2019 в 22:28
поделиться