admin管理员组

文章数量:1312757

Considering, I have an array like this [..., n-2, n-1, n, n+1, n+2, ...]. I would like to sort it in this way [n, n+1, n-1, n+2, n-2,...] with n equals to the middle of my array.

For example:

Input:

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

Output:

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

Considering, I have an array like this [..., n-2, n-1, n, n+1, n+2, ...]. I would like to sort it in this way [n, n+1, n-1, n+2, n-2,...] with n equals to the middle of my array.

For example:

Input:

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

Output:

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

What I have done works properly, but I would like to know if there is a better way or a more efficient way to do so ?

Share Improve this question edited May 29, 2019 at 17:47 Emma 27.8k11 gold badges48 silver badges71 bronze badges asked May 28, 2019 at 12:26 PierBJXPierBJX 2,3535 gold badges24 silver badges58 bronze badges 3
  • 1 If you're looking to improve already working code, please go to codereview instead. (As a sidenote, how can you get the middle of an array that has an even number of elements?) – Yannick K Commented May 28, 2019 at 12:30
  • @YannickK Alright, I will do it next time. (To answer to your question, in the loop I check if the element exists and given that I do n-1 and n+1 I get all the number of the list) – PierBJX Commented May 30, 2019 at 7:25
  • 1 Oh yeah I understand how you're getting the middle element, I mean that technically there isn't a middle element in an even array. In this case the middle index would be 4.5, which is of course impossible. Maybe it doesn't matter for your purposes, I was just wondering whether you meant something else. – Yannick K Commented May 30, 2019 at 8:23
Add a ment  | 

2 Answers 2

Reset to default 10

You could take a pivot value 5 and sort by the absolute delta of the value and the pivot values an sort descending for same deltas.

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

You can do that in following steps:

  • Create an empty array for result.
  • Start the loop. Initialize i to the half of the length.
  • Loop backwards means decrease i by 1 each loop.
  • push() the element at current index to the result array first and the other corresponding value to the array.

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]

本文标签: javascriptHow to sort an array starting from the middleStack Overflow