以下是我的面试问题。但我无法破解它,甚至不知道如何完成它。
var arr = [1,4,5,8,3,2,6,9,7,10];
替代排序的预期输出:
[10,1,9,2,8,3,7,4,6,5]
我尝试过的:
我尝试切出 Math.max.apply(null,arr) 和 Math.min.apply(null,arr) 或者将其插入单独的空数组。但被告知该算法不是最优的。
请您参考如下方法:
我会对数组进行排序,然后迭代它,在每次迭代中从开头和结尾选取值(内循环计算的偏移量)。对奇数数组的最终检查将完成该过程。
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);
结果:
b = [10, 1, 9, 2, 8, 3, 7, 4, 6, 5]
算法的好处:
- 避免对原始数组进行更改(通过
pop
和shift
),可显着提高性能。 - 在循环之前预先计算
l
和L
,可以避免在每次迭代中重复计算。 - 在过程结束时进行单个条件检查来处理奇数数组,可以稍微提高速度。
I've prepared some PERFORMANCE TESTS, with some of the proposed algorithms : Original Array(10 items) and Big Array(1000 items)