分析:
- 首先需要分区,每区分为10万,假设分为a个区
- 在每个区里,求出最大的N个,由此得出a个长度为N的数组
- 将上述a个长度为N的数组合并为一个数组b
- 在b中求出最大的N个
- 主要注意的是,如果合并后的数组仍旧很大,则再进行1-3步骤,否则则直接进行步骤4。
上代码:
代码语言:javascript复制let arr = [];
for (let i = 0; i < 100000000; i ) {
arr.push(Math.ceil(Math.random() * 10000000));
}
function findMax(arr, num) {
if (arr.length <= num) {
return arr.sort((a, b) => {
if (a > b) {
return 1;
} else {
return -1;
}
});
}
let tempMaxArr = arr.splice(0, num);
const sortArr = function() {
tempMaxArr = tempMaxArr.sort((a, b) => {
if (a > b) {
return 1;
} else {
return -1;
}
})
}
sortArr();
for (let i = 0; i < arr.length; i ){
if (arr[i] > tempMaxArr[0]) {
// tempMaxArr.shift();
// tempMaxArr.unshift(arr[i]);
tempMaxArr[0] = arr[i];
sortArr();
}
}
return tempMaxArr;
}
function findBiggest(arr, num) {
if (Object.prototype.toString.call(arr) !== '[object Array]') {
throw new Error('请传入数字');
}
const diff = 100000;
const len = Math.ceil(arr.length / diff);
let tempTotalBigArr = [];
for (let i = 0; i < len; i ) {
const tempArr = arr.slice(i * diff, (i 1) * diff);
const tempBigArr = findMax(tempArr, num);
tempTotalBigArr = tempTotalBigArr.concat(tempBigArr);
}
if (tempTotalBigArr.length > diff) {
findBiggest(tempTotalBigArr, num);
} else {
const bigArr = findMax(tempTotalBigArr, num);
console.log(`最大的${ num }个数字:`, bigArr);
}
}
findBiggest(arr, 100);
至于findMax方法,在另外一篇文章【从10万个数中找10个最大的数】已讲述,这里不再进行额外讲述。