以下是我的面试问题.但我无法破解它,甚至无法想到如何完成这项工作.
var arr = [1,4,5,8,3,2,6,9,7,10];
Run Code Online (Sandbox Code Playgroud)
备用排序的预期输出:
[10,1,9,2,8,3,7,4,6,5]
Run Code Online (Sandbox Code Playgroud)
我尝试过:
我尝试将Math.max.apply(null,arr)和Math.min.apply(null,arr)切换成单独的空数组.但据说这个算法不是最优的.
col*_*lxi 20
我会对数组进行排序,然后迭代它,在每次迭代中从开始和结束(内循环计算的偏移)中选择值.对奇数阵列的最终检查将完成该过程.
let 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(var i=0; i<L; i++) b.push( a[l-i] ,a[i] );
if(a.length%2) b.push( a[i] ); // add last item in odd arrays
console.log(b);Run Code Online (Sandbox Code Playgroud)
结果:
b = [10, 1, 9, 2, 8, 3, 7, 4, 6, 5]
Run Code Online (Sandbox Code Playgroud)
算法利益:
pop和shift)的改变,大大提高了性能.l和L循环之前,无需在每次迭代中重复计算.我准备了一些性能测试,其中包括一些提议的算法: Original Array(10项) 和Big Array(1000项)
这是一种方法:
var arr = [1, 4, 5, 8, 3, 2, 6, 9, 7, 10];
// Sort the source array
arr.sort((a, b) => a - b);
// This will be the final result
var result = [];
// Create two pointers
var a = 0,
b = arr.length - 1;
while (result.length < arr.length) {
// Push the elements from start and end to the result array
result.push(arr[b]);
// Avoid bug when array is odd lengthed
if (a !== b) {
result.push(arr[a]);
}
a++;
b--;
}
console.log(result);Run Code Online (Sandbox Code Playgroud)
这个想法是有两个指针(a和b)从两个方向遍历排序的原始数组并附加元素result.