У меня есть проблема, которую я нашел на форуме алгоритмов в другом месте.
У меня есть массив со случайными числами (например, [5, 2, 7, 9, 2, 3, 8, 4]
), который должен быть возвращен мне отсортированным по четному, четному. Порядок шансов/эвенов не важен, поэтому в примере это, вероятно, будет [5, 7, 9, 3, 2, 2, 8, 4]
.
Моя первая мысль заключалась в том, чтобы использовать функцию .reduce()
, чтобы просто вставить их в два разных массива, а затем объединить их вместе, но для этой задачи есть некоторые дополнительные сложности.
Добавленные правила задачи состоят в том, что сортировка должна поддерживать постоянное дополнительное пространство и изменять массив на месте. Он также должен использовать алгоритм, который последовательно масштабируется с размером массива.
Какой алгоритм?
Судя по Wikipedia list, существует ряд алгоритмов, которые масштабируются последовательно и используют постоянное пространство. Я также нашел этот веб-сайт, который имеет приятный вид пузыря для использования (также размещен ниже), который кажется стабильным и соответствует моим правилам (я думаю?).
Я не уверен, что это правильный алгоритм для использования или как вообще подходить к этой части задачи.
Bubble:
function comparator(a, b) {
return a - b;
}
/**
* Bubble sort algorithm.<br><br>
* Complexity: O(N^2).
*
* @example
* var sort = require('path-to-algorithms/src/' +
* 'sorting/bubblesort').bubbleSort;
* console.log(sort([2, 5, 1, 0, 4])); // [ 0, 1, 2, 4, 5 ]
*
* @public
* @module sorting/bubblesort
* @param {Array} array Input array.
* @param {Function} cmp Optional. A function that defines an
* alternative sort order. The function should return a negative,
* zero, or positive value, depending on the arguments.
* @return {Array} Sorted array.
*/
function bubbleSort(array, cmp) {
cmp = cmp || comparator;
var temp;
for (var i = 0; i < array.length; i += 1) {
for (var j = i; j > 0; j -= 1) {
if (cmp(array[j], array[j - 1]) < 0) {
temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
return array;
}