若干个数字,怎么选出最大的五个
方法一
let arr=[];
arr.length=10000000;
for(let i=0,len=arr.length; i<len; i++){
arr[i]=Math.ceil(Math.random()*10000)
}
function max(arr){
arr.sort((a,b)=>{
if(a<b){
return 1
}else {
return -1
}
})
return arr.slice(0,5)
}
let dete=new Date().getTime()
console.log(max(arr));
console.log(new Date().getTime() - dete);
最简单最直接但是效率最低的办法,把数组排序,去最大的5个
方法二
let arr=[];
arr.length=10000000;
for(let i=0,len=arr.length; i<len; i++){
arr[i]=Math.ceil(Math.random()*10000)
}
function max(arr){
let num=arr.length
if(num<=5){//长度小于五直接返回
return arr
}else{//长度大于五,把数组分成两个数组,再去寻找每个数组最大的五个数
let arr1=arr.slice(0,Math.ceil(num/2)),arr2=arr.slice(Math.ceil(num/2),num)
if(arr1.length<=5&arr2.length<=5){//分成两个后的长度都小于五,直接在这两个数组中找出最大的五个数
let res=arr1.concat(arr2);
res.sort((a,b)=>{
if(a<b){
return 1
}else {
return -1
}
})
return res.slice(0,5)
}else {//否则分别求出这两个数组的最大的五个数,再进行计算 其实此处可以再细分成某一个长度大于五的情况,影响不大
let res=max(arr1).concat(max(arr2));
res.sort((a,b)=>{
if(a<b){
return 1
}else {
return -1
}
})
return res.slice(0,5)
}
}
}
let dete=new Date().getTime()
console.log(max(arr));
console.log(new Date().getTime() - dete);
利用函数递归,将原数组无线分组再来找最大的五个数,该方法节省了数组排序的时间
如果数组长度不大,两个方法的执行时间差不多;但是如果数组长度像我写的有一千万甚至上亿的时候差别就显示出来了,当长度为一千万,方法一的计算时间为18秒左右,而方法二的计算时间只有6秒