如何只对数组的一部分进行排序?在给定索引之间



我有一个数字数组,只需要按左右屏障对其中的一部分进行排序。你能帮助我如何正确地实施它吗?

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]

谢谢你的帮助。

这是一种直接使用sort的方法,但使用Proxylength和索引进行访问。

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]

您可以使用Divide and Conque方法来完成此操作。你可以试试这个-

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}

最终(我希望(:

newArr = [].concat(
arr.slice(0,left),
arr.slice(left,right+1).sort(),
arr.slice(right+1,arr.length)
)

包含right
假设左不大于右,
>假设数组不为空,
等等。


上一次编辑:
我已经阅读了评论
基本正确
我监督的问题是,请求的排序介于左和右之间包含,而slice的第一个参数是包括并且第二个参数是排除。

现在,我看到了,最后一部分应该是负值,左边和数组长度之间的差
但是,我不会试图解决这个问题。。。

我的原创作品";回答":
我建议您使用slice将数组拆分为3个子数组,对中间部分进行排序,然后使用concat将它们重新组合在一起,例如:

newArr=[].concat(arr.slice(0,left),arr.slice(left,right+1).sort(),arr.slice(left+right-1))

我可以建议你通过网络搜索来更熟悉sliceconcat吗?

相关内容

  • 没有找到相关文章

最新更新