使用javascript执行数组交替排序的最佳算法?

使用javascript执行数组交替排序的最佳算法?,javascript,Javascript,以下是我的面试问题。但我无法破解它,甚至无法思考如何完成它 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)交替切分,以推入单独的空数组。但有人告诉我们,该算法不是最优的。这里有一种方法: var-arr=[1,4,5,8,3,2,6,9,7,10]; //对源数组进行排序 arr.so

以下是我的面试问题。但我无法破解它,甚至无法思考如何完成它

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)交替切分,以推入单独的空数组。但有人告诉我们,该算法不是最优的。

这里有一种方法:

var-arr=[1,4,5,8,3,2,6,9,7,10];
//对源数组进行排序
arr.sort((a,b)=>a-b);
//这将是最终结果
var结果=[];
//创建两个指针
var a=0,
b=阵列长度-1;
while(result.length控制台日志(结果)我将对数组进行排序,然后在每次迭代中对其进行迭代,从开始和结束处拾取值(inloop计算的偏移量)。对奇数数组的最后检查将完成该过程

a=[1,4,5,8,3,2,6,9,7,10];
a、 排序((a,b)=>a-b);
设b=[];
设l=a.length-1;//微观优化
设L=L/2;//微观优化

对于(var i=0;i仅增加一个变量的替代方法:

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

arr = arr.sort((a, b) => b - a);

var result = [];

var a = 0;
while (result.length < arr.length) {
    result.push(arr[a]);
    result.push(arr[arr.length - a - 1]);
    a++;
}

console.log(result);
var-arr=[1,4,5,8,3,2,6,9,7,10];
arr=arr.sort((a,b)=>b-a);
var结果=[];
var a=0;
while(result.length
以下是我的答案,根据你的直觉,你从前面开始,然后从后面重复地从排序的数组中提取,直到你是空的。诀窍是避免计算整个数组的“max”和“min”,而只排序一次

如果原始数组的长度为奇数,则许多其他答案会在数组中放入未定义的值。我会对这些值发表评论,但我没有声誉。这就是为什么我会对每个循环进行两次边界检查

var arr = [1,4,5,8,3,2,6,9,7,10];
// Sort numerically (not lexicographically)
arr.sort((a, b) => a - b)
// The output array
var out = []
// Take from the front, then back until original array is empty
while (true) {
  if (arr.length == 0) break
  out.push(arr.pop())
  if (arr.length == 0) break
  out.push(arr.shift())
}
// Output answer
console.log(out)

对数组进行排序
并将其分成两部分,现在使用reduce来放置两个数组中的元素

//原始数组
var-arr=[1,4,5,8,3,2,6,9,7,10];
//按升序排序原始数组
var m=arr.sort(函数(a,b){
返回a-b;
});
//将已排序数组分为两部分
设getFirstSet=m.拼接(0,arr.length/2);
//现在,我将在拼接后保留剩余的项目
//再次按降序排序,以避免反向循环
让getSecondSet=m.sort(函数(a,b){
返回b-a;
});
//使用reduce函数
让newArray=getFirstSet.reduce(函数(acc、curr、index){
//从包含10,9,8,7,6的第二个数组中推送元素
acc.push(getSecondSet[索引]);
//从包含1,2,3,4,5的第一个数组中推送元素
acc.push(getFirstSet[索引]);
返回acc;
},[]);//[]是将在其中推送元素的初始数组

console.log(newArray)
另一种替代视图…这种时髦的排序是否应该像
.sort
那样就地进行

let input=[1,4,5,8,3,2,6,9,7,10];
输入.sort((a,b)=>b-a).every((n,i,a)=>(a.splice((i*2+1),0,a.pop()),(i*2console.log(input);
如果您假设数组将是一组序列号(询问数据是一个很好的问题),则无需对原始数组(即O(n))进行排序或变异,即可快速完成此操作:

var-arr=[1,4,5,8,3,2,6,9,7,10];
设a=arr.reduce((a,c,i)=>{

这里有一个快速解决方案,使用三元运算符和模运算符进行切换

let arr = [1, 4, 5, 8, 3, 2, 6, 9, 7, 10];
let j = 0;
let k = arr.length - 1;

// sort array
arr.sort((a, b) => a - b);

let new_array = [];
for (let i in arr) {
  new_array[i] = i % 2 == 0 ? arr[k--] : arr[j++];
}
// prints array
console.log(new_array);

我的可读性/无隐藏魔法解决方案:

//输入
var arr=[1,4,5,8,3,2,6,9,7,10];
//分类
var arr1=arr.sort((a,b)=>(a-b));
//谱写
var arr2=[];
对于(变量i=0;i
var a=[1,4,5,8,3,2,6,9,7,10];
var b=a.sort((a,b)=>a-b);
var c=a.sort((a,b)=>a-b).reverse();
var d=[];
设e=a.length-1;
设f=e/2;

对于(让i=0;i a-b).reverse().pop());

输入是否遵循某种顺序?如果不遵循,在最坏的情况下,您不能比常规排序做得更好,因此请查看您是否能够找出如何将排序数组转换为该格式。
arr.sort((a,b)=>(Math.abs(b-5.4)-Math.abs(a-5.4)));
工作正常:D@EricDuminil这也是我的第一个想法。但这确实让我觉得问题的定义不明确。不可能判断您的算法或许多答案中的算法是否能给出正确的结果。Prem,您有没有机会澄清这些要求?我的答案是:“要求不明确。请咨询客户。”;)他们给你一个预期的输出,但他们没有解释他们达到这个目标的过程或规则。实际上,你永远不应该猜测工作中的这些细节。要求你优化给定的特定需求是一回事,要求你从输出中猜测需求是另一回事。我有点怀疑这是否是一个骗局选择查看您是否愿意从他们那里获取更多信息,而不是表面上接受这些信息。@colxi仅对包含10项的数组进行排序几乎没有意义
shift()
是O(n).Ah,我不知道。显然它是特定于实现的,有些人在减慢索引速度的同时以不同的方式实现了它,但是在一个面试问题的上下文中,当在JSFIDLE()中运行时,输入'a=[1,4,5,8,3,2,6,9,7,10,11];'将输出的可能是O(n)@markm,即标记为答案的答案()(在谷歌浏览器中)
[11,1,10,2,9,
var a = [1,4,5,8,3,2,6,9,7,10];
var b = a.sort((a, b) => a - b);
var c = a.sort((a, b) => a - b).reverse();
var d = [];

let e = a.length-1;
let f = e/2;

for(let i=0; i<f; i++)  d.push( b.pop(), c.pop() );