- A+

Category：Languages

The following was my interview question. But I couldn't crack it and even could not think how to get this done.

`var arr = [1,4,5,8,3,2,6,9,7,10]; `

Expected output of alternate sorting:

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

What I have tried:

I tried slicing out the Math.max.apply(null,arr) and Math.min.apply(null,arr) alternatively to push into separate empty array. But It was told that the algorithm is not optimal.

I would sort the array, and then iterate it, picking the last and the first value, in each iteration

`let a = [1, 4, 5, 8, 3, 2, 6, 9, 7, 10]; a.sort((a, b) => a - b); let b = []; while(a.length) b.push( a.pop(), a.shift() ); `

Result :

`b = [10, 1, 9, 2, 8, 3, 7, 4, 6, 5] `

Edit: This is abetter solution, using the same concept, but without modifying the original array (improved performance), and a couple of micro optimizations :

`var a = [1, 4, 5, 8, 3, 2, 6, 9, 7, 10]; a.sort((a, b) => a - b); let b =[]; let l = a.length-1; // micro optimization let L = l/2; // micro optimization for(let i=0; i<L; i++) b.push( a[l-i] ,a[i] ); `

Algorithm improvements:

- Avoiding alterations in the original array (through
`pop`

and`shift`

), improves the performance considerably. - Precalculating
`l`

and`L`

before the loop , prevents the need of being calculated repeatedly in each iteration.