如何从中间开始对数组排序?

时间:2019-05-28 12:26:05

标签: javascript arrays sorting pivot

考虑到,我有一个像这样的数组[...,n-2,n-1,n,n + 1,n + 2,...]。我想以[n,n + 1,n-1,n + 2,n-2,...]的方式对它进行排序,其中n等于数组的中间。

例如:

输入:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

输出:

[5, 6, 4, 7, 3, 8, 2, 9, 1, 0]

let arrayNotSorted = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let positionMiddleArray = Math.trunc(arrayNotSorted.length / 2);

let arraySorted = [arrayNotSorted[positionMiddleArray]];

for(let i=1; i <= positionMiddleArray; i++){
 if(arrayNotSorted[positionMiddleArray + i] !== undefined){
		arraySorted.push(arrayNotSorted[positionMiddleArray + i]);
  }
  if(arrayNotSorted[positionMiddleArray - i] !== undefined){
  	arraySorted.push(arrayNotSorted[positionMiddleArray - i]);
  }
}

console.log('Not_Sorted', arrayNotSorted);
console.log('Sorted', arraySorted);

我所做的工作正常,但是我想知道是否有更好的方法或更有效的方法?

2 个答案:

答案 0 :(得分:6)

您可以采用枢轴值5并按值的绝对增量排序,而枢轴值按相同增量的降序排序。

var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    pivot = 5;

array.sort((a, b) => Math.abs(a - pivot) - Math.abs(b - pivot) || b - a);

console.log(...array); // 5 6 4 7 3 8 2 9 1 0

答案 1 :(得分:1)

您可以按照以下步骤进行操作:

  • 为结果创建一个空数组。
  • 开始循环。将i初始化为长度的一半。
  • 向后循环意味着每个循环将i减少1
  • push()首先将当前索引处的元素指向结果数组,并将另一个对应的值指向数组。

function sortFromMid(arr){
  let res = [];
  for(let i = Math.ceil(arr.length/2);i>=0;i--){
    res.push(arr[i]);
    res.push(arr[arr.length - i + 1])
  }
  return res.filter(x => x !== undefined);
}

console.log(sortFromMid([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))

[5, 6, 4, 7, 3, 8, 2, 9, 1, 0]