Существует несколько возможных стратегий.
Используйте массив индексов, чтобы у вас был уровень косвенности - создайте массив [0, 1, 2, 3, 4, 5, ...] и отсортировать его с помощью специального компаратора, который разыменовывает 3 в массив [3].Компонент разыменования может не подчиняться транзитивному свойству, хотя вы можете столкнуться с неопределенным поведением.O (n) требуется дополнительная память.
var array = [6, 3, 18, 'four', 8, 'five', 6, 'nineteen', 'eight', 'two'];
// Create an array of indices.
var indices = [];
for (var i = array.length; --i >= 0;) { indices[i] = i; }
// indices is [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
// Sort the indices, comparing by number of corresponding element iff
// corresponding elements are both numbers.
indices.sort(function (i, j) {
var a = array[i], b = array[j]; // dereference
if (a === (a | 0) && b === (b | 0)) {
return a === b ? 0 : a < b ? -1 : 1;
} else {
return i - j;
}
});
var newArray = [];
for (var i = array.length; --i >= 0;) { newArray[i] = array[indices[i]; }
array = newArray;
Другим классом решений является извлечение чисел, сортировка и последующая замена, которая требует O (n) дополнительной памяти в худшем случае.
var array = [6, 3, 18, 'four', 8, 'five', 6, 'nineteen', 'eight', 'two'];
var integers = array.filter(function (x) { return x === (x | 0); });
integers.sort();
for (var i = 0, k = 0; k < integers.length; ++i) {
if (array[i] === (array[i] | 0)) { array[i] = integers[k++]; }
}