til*_*lak 8 javascript sorting algorithm
我需要更优化的javascript代码才能找到数组中最大的3个元素.我试过这个代码.
var maxIndex = new Array();
var maxPoints = new Array();
var scoreByPattern = new Array(93,17,56,91,98,33,9,38,55,78,29,81,60);
function findLargest3(){
maxPoints[0]=0;
maxPoints[1]=0;
maxPoints[2]=0;
for(i=0;i < scoreByPattern.length; i++){
if( scoreByPattern[i] > maxPoints[0]){
maxPoints[0] = scoreByPattern[i];
maxIndex[0]=i;
}
}
for(i=0;i < scoreByPattern.length; i++){
if( scoreByPattern[i] > maxPoints[1] && scoreByPattern[i]< maxPoints[0] ){
maxPoints[1] = scoreByPattern[i];
maxIndex[1]=i;
}
}
for(i=0;i < scoreByPattern.length; i++){
if( scoreByPattern[i] > maxPoints[2] && scoreByPattern[i]< maxPoints[1] ){
maxPoints[2] = scoreByPattern[i];
maxIndex[2]=i;
}
}
alert(scoreByPattern+"/******/"+maxPoints[0]+"/"+maxPoints[1]+"/"+maxPoints[2]);
//alert(maxIndex);
}
Run Code Online (Sandbox Code Playgroud)
如何优化以上?(我需要最大数字的索引)是否有其他简单的方法来解决问题?
huy*_*itw 11
修改版
我修改了我的答案,使其更通用.它搜索数组中n个最大元素的索引:
var scoreByPattern = [93,255,17,56,91,98,33,9,38,55,78,29,81,60];
function findIndicesOfMax(inp, count) {
var outp = [];
for (var i = 0; i < inp.length; i++) {
outp.push(i); // add index to output array
if (outp.length > count) {
outp.sort(function(a, b) { return inp[b] - inp[a]; }); // descending sort the output array
outp.pop(); // remove the last index (index of smallest element in output array)
}
}
return outp;
}
// show original array
console.log(scoreByPattern);
// get indices of 3 greatest elements
var indices = findIndicesOfMax(scoreByPattern, 3);
console.log(indices);
// show 3 greatest scores
for (var i = 0; i < indices.length; i++)
console.log(scoreByPattern[indices[i]]);
Run Code Online (Sandbox Code Playgroud)
这是一个jsFiddle
对数组进行降序排序,然后得到它的前三个元素:
var maxPoints = new Array();
var scoreByPattern = new Array(93,17,56,91,98,33,9,38,55,78,29,81,60);
findLargest3();
function findLargest3(){
// sort descending
scoreByPattern.sort(function(a,b) {
if (a < b) { return 1; }
else if (a == b) { return 0; }
else { return -1; }
});
alert(scoreByPattern+"/******/"+scoreByPattern[0]+"/"+scoreByPattern[1]+"/"+scoreByPattern[2]);
}
Run Code Online (Sandbox Code Playgroud)
没有排序巨大的数组:O(n)
考虑大数组运行.返回一个数组数组,[x,y]
其中x
value y
是大数组中的值和索引.
var ar = [3,172,56,91,98,33,9,38,55,78,291,81,60];
console.log(`input is: ${ar}`);
function getMax(ar){
if (ar.length < 3) return ar;
var max = [[ar[0],0],[ar[1],1],[ar[2],2]],
i,j;
for (i = 3;i<ar.length;i++){
for (j = 0;j<max.length;j++){
if (ar[i] > max[j][0]){
max[j] = [ar[i],i];
if (j<2){
max.sort(function(a,b) { return a[0]-b[0]; });
}
break;
}
}
}
return max;
}
result = getMax(ar);
console.log('output [number,index] is:');
console.log(result);
Run Code Online (Sandbox Code Playgroud)