第一次见到类似题目大约是在六年前吧。一道简单的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]
欢迎批评指正。