如何只对数组的一部分进行排序?在给定索引之间
How to sort only part of array? between given indexes
我有一个数字数组,我只需要按左右障碍对其中的一部分进行排序。
你能帮我看看如何正确实施吗?
const sortBetween = (arr, left, right) => {
...
}
given: [9,3,5,7,4,9,4,1] , left = 2, right = 5
expected: [9,3,4,5,7,9,4,1]
[9,3,5,7,4,9,4,1] -> [9,3,4,5,7, 9,4,1]
感谢您的帮助。
决赛(我希望):
newArr = [].concat(
arr.slice(0,left),
arr.slice(left,right+1).sort(),
arr.slice(right+1,arr.length)
)
包括right
,
假设左边不大于右边,
假设数组不为空,
等等
上次编辑:
我看了评论。
基本正确。
我监督的问题是请求的排序在左右 inclusively 之间,而 slice
的第一个参数是 inclusive 和第二个参数是 独占.
我明白了,现在,最后一部分应该是一个负值,即 left 和数组长度之间的差值。
但是,我不会尝试解决这个问题...
我原来的“答案”:
我建议你使用 slice
将数组拆分为 3 个子数组,对中间进行排序,然后使用 concat
将它们重新组合在一起,例如:
newArr=[].concat(arr.slice(0,left),arr.slice(left,right+1).sort(),arr.slice(left+right-1))
我可以建议您通过搜索网络更熟悉 slice
和 concat
吗?
您可以使用分而治之方法来完成。你可以试试这个-
const sortBetween = (arr, left, right) => {
let leftArr = [],
rightArr = [],
sortedArr = [];
/**
* Divide the array into 3 parts. Left, Mid, Right.
* You have to sort the mid one.
*/
if (left > 0) {
leftArr = arr.slice(0, left);
}
if (right < arr.length) {
rightArr = arr.slice(right);
}
sortedArr = arr.slice(left, right).sort();
// Finally merge the 3 parts and returns
return [...leftArr, ...sortedArr, ...rightArr];
}
const arr = [9,3,5,7,4,9,4,1];
const res = sortBetween(arr, 2, 5);
const res1 = sortBetween(arr, 0, 5);
const res2 = sortBetween(arr, 0, 8);
console.log(res, res1, res2);
.as-console-wrapper {min-height: 100%!important; top: 0}
这是一种直接使用 sort
的方法,但使用 Proxy
为 length
和索引调整访问。
type original array length
------- ------------------------ ------
values 9 3 5 7 4 9 4 1 8
indices 0 1 2 3 4 5 6 7
------- ------------------------ ------
type proxy view length
------- ------------------------ ------
values 5 7 4 9 4
indices 0 1 2 3
------- ------------------------ ------
const
sortBetween = (array, left, right) => {
new Proxy(array, {
get (target, prop) {
if (isFinite(prop)) return target[+prop + left];
if (prop === 'length') return right - left + 1;
return target[prop];
},
set (target, prop, receiver) {
target[+prop + left] = receiver;
return true;
}
})
.sort((a, b) => a - b);
return array;
};
console.log(...sortBetween([9, 3, 5, 7, 0, 9, 4, 1], 2, 5)); // [9, 3, 0, 5, 7, 9, 4, 1]
我有一个数字数组,我只需要按左右障碍对其中的一部分进行排序。 你能帮我看看如何正确实施吗?
const sortBetween = (arr, left, right) => {
...
}
given: [9,3,5,7,4,9,4,1] , left = 2, right = 5
expected: [9,3,4,5,7,9,4,1]
[9,3,5,7,4,9,4,1] -> [9,3,4,5,7, 9,4,1]
感谢您的帮助。
决赛(我希望):
newArr = [].concat(
arr.slice(0,left),
arr.slice(left,right+1).sort(),
arr.slice(right+1,arr.length)
)
包括right
,
假设左边不大于右边,
假设数组不为空,
等等
上次编辑:
我看了评论。
基本正确。
我监督的问题是请求的排序在左右 inclusively 之间,而 slice
的第一个参数是 inclusive 和第二个参数是 独占.
我明白了,现在,最后一部分应该是一个负值,即 left 和数组长度之间的差值。
但是,我不会尝试解决这个问题...
我原来的“答案”:
我建议你使用 slice
将数组拆分为 3 个子数组,对中间进行排序,然后使用 concat
将它们重新组合在一起,例如:
newArr=[].concat(arr.slice(0,left),arr.slice(left,right+1).sort(),arr.slice(left+right-1))
我可以建议您通过搜索网络更熟悉 slice
和 concat
吗?
您可以使用分而治之方法来完成。你可以试试这个-
const sortBetween = (arr, left, right) => {
let leftArr = [],
rightArr = [],
sortedArr = [];
/**
* Divide the array into 3 parts. Left, Mid, Right.
* You have to sort the mid one.
*/
if (left > 0) {
leftArr = arr.slice(0, left);
}
if (right < arr.length) {
rightArr = arr.slice(right);
}
sortedArr = arr.slice(left, right).sort();
// Finally merge the 3 parts and returns
return [...leftArr, ...sortedArr, ...rightArr];
}
const arr = [9,3,5,7,4,9,4,1];
const res = sortBetween(arr, 2, 5);
const res1 = sortBetween(arr, 0, 5);
const res2 = sortBetween(arr, 0, 8);
console.log(res, res1, res2);
.as-console-wrapper {min-height: 100%!important; top: 0}
这是一种直接使用 sort
的方法,但使用 Proxy
为 length
和索引调整访问。
type original array length
------- ------------------------ ------
values 9 3 5 7 4 9 4 1 8
indices 0 1 2 3 4 5 6 7
------- ------------------------ ------
type proxy view length
------- ------------------------ ------
values 5 7 4 9 4
indices 0 1 2 3
------- ------------------------ ------
const
sortBetween = (array, left, right) => {
new Proxy(array, {
get (target, prop) {
if (isFinite(prop)) return target[+prop + left];
if (prop === 'length') return right - left + 1;
return target[prop];
},
set (target, prop, receiver) {
target[+prop + left] = receiver;
return true;
}
})
.sort((a, b) => a - b);
return array;
};
console.log(...sortBetween([9, 3, 5, 7, 0, 9, 4, 1], 2, 5)); // [9, 3, 0, 5, 7, 9, 4, 1]