1. 程式人生 > >TOP k演算法

TOP k演算法

面試題:演算法題 10萬次搜尋,兩兩比較找出top100,然後比較次數總次數不超過20萬次,不能碎片化申請空間,一次性申請一個大陣列作為儲存。 下午:索貝科技有限公司

    #include <iostream>
    using namespace std;


    // 構建大根堆,其中a是第一個非葉子節點,z是節點個數
    void HeapAdjust(int A[], int a, int z)
    {
        // 重建最大堆,i是父節點,j是左子節點
        for(int i = a, j = 2 * i; j <= z; i = j, j = 2
* i) { // 取i的左右子節點中較大的子節點 if(j < z && A[j + 1] > A[j]) j++; if(A[i] < A[j]) swap(A[i], A[j]); else break; } } // 從右到做,從下到上 void HeapSort(int A[], int n) { // 第一步:建立大根堆(i是第一個非葉子節點,n是節點個數)
for(int i = n / 2; i >= 1; i--) { HeapAdjust(A, i, n); } for(int i = n; i >= 1; i--) { // 第二步:交換堆元素(堆首和堆尾) swap(A[1], A[i]); // 第三步:重建大根堆 HeapAdjust(A, 1, i - 1); } } void TopK(int
n,int top) { int * arr = (int *)malloc(sizeof(arr)*n); if(arr==NULL) { return ; } for(int i = 1; i <=n; i++) { arr[i] = rand(); } HeapSort(arr, n); for(int i = 1;i<=top;i++) { cout<<arr[i]<<endl; } if(arr!=NULL) { arr=NULL; free(arr); } } int main() { TopK(10000,30); system("pause"); return 0; }