Reputation: 20245
I have an array and would like to sort all but the last n elements.
For example, if the array is 10 elements long, would like elements 0 through 7 to be sorted while elements 8-9 are left in place.
Upvotes: 14
Views: 13835
Reputation: 1155
Following function sorts part of array in-place, by first copying part to be sorted into temporary array and then copying sorted elements back to correct position. This solution creates only 1 additional array (some other answers do more) and does not overflow stack if there are a lot of elements.
function arraySortPart (array, from, to, compare) {
const toSort = array.slice(from, to);
toSort.sort(compare);
for (let i = from; i < to; ++i) {
array[i] = toSort[i - from];
}
return array;
}
Upvotes: 0
Reputation: 22876
splice
can be used to remove part of array and insert sorted part of the array :
const a = [9,8,7,6,5,4,3,2,1];
a.splice(3, 3, ...a.slice(3, 6).sort());
console.log( JSON.stringify( a ) ); // [9,8,7,4,5,6,3,2,1]
Upvotes: 1
Reputation: 11
let arr = [2, 1, 5, 4, 3];
arr = [...arr.slice(0, 2), ...arr.slice(2).sort((a, b) => a - b)];
After sorting a sub-array the original array will be [2, 1, 3, 4, 5]
Upvotes: 1
Reputation: 427
An ES6 riff on the solution provided by @darin
let subSort = (arr, i, n, sortFx) => [].concat(...arr.slice(0, i), ...arr.slice(i, i + n).sort(sortFx), ...arr.slice(i + n, arr.length));
So it's possible to sort a range within an array:
var array = [5, 2, 6, 4, 1, 9, 3, 8, 7];
// sort array beginning at index 2; sort 4 elements of array
subSort(array, 2, 4, (a, b) => a - b);
// array is now [5, 2, 1, 4, 6, 9, 3, 8, 7]
subSort(array, 2, 4, (a, b) => b - a);
// array is now [5, 2, 9, 6, 4, 1, 3, 8, 7]
subSort() can be used for objects of arbitrary complexity.
Upvotes: 4
Reputation: 324647
If you need to sort the array in place (i.e. without creating a new, sorted array), which is what the sort()
method does, you could do the following:
var array = [5, 2, 6, 4, 0, 1, 9, 3, 8, 7];
var unsorted = array.slice(7);
array.length = 7;
array.sort().push.apply(array, unsorted);
More generally, here's a function to sort a portion of an array in place. Like the sort()
method, it also returns a reference to the array.
function partialSort(arr, start, end) {
var preSorted = arr.slice(0, start), postSorted = arr.slice(end);
var sorted = arr.slice(start, end).sort();
arr.length = 0;
arr.push.apply(arr, preSorted.concat(sorted).concat(postSorted));
return arr;
}
Example:
var array = [5, 2, 6, 4, 0, 1, 9, 3, 8, 7];
partialSort(array, 0, 7);
Upvotes: 11
Reputation: 1039298
var array = [5, 2, 6, 4, 1, 9, 3, 8, 7];
array = array.slice(0, 7).sort().concat(array.slice(7, 10));
// array is now [1, 2, 3, 4, 5, 6, 9, 8, 7]
Upvotes: 19