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

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))

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

您可以使用分而治之方法来完成。你可以试试这个-

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 的方法,但使用 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]