第一次见到类似题目大约是在六年前吧。一道简单的ACM题,自己费半天劲用土方法得出结果,跟别人用堆排序求得结果的时间效率相差数倍,使得笔者第一次深切领略到算法的魅力。六年之后,再一次被人问到这道题,“堆排序”瞬间蹦入脑海。
不同的是,当时玩C,现在玩Java和JS,最熟的就是JS了,于是用JS把算法写了出来:
function topKMaxOfArr(k, arr){
function swap(a, b){
var t = arr[a];
arr[a] = arr[b];
arr[b] = t;
}
var i,j;
//只需循环k次
for(i=arr.length;i>arr.length-k;i--){
for(j=Math.floor(i/2)-1;j>=0;j--){
if(arr[j]<arr[2*j+1]){
swap(j, 2*j+1);
}
if(2*j+2<i && arr[j]<arr[2*j+2]){
swap(j, 2*j+2);
}
}
swap( i-1, 0 );
}
return arr.slice( arr.length - k );
}
//用法示例
var arr = [4,2,5,6,77,33,21,44,55,22], k=5;
topKMaxOfArr(k, arr);//返回数组[22, 33, 44, 55, 77]
欢迎批评指正。