求陣列最大k個數的問題(堆的應用)

2021-06-25 07:02:59 字數 498 閱讀 5451

1)笨方法,先用快速排序對陣列排序在找前k個;

2)  用堆,先建立k小頂堆,再掃瞄整個陣列,堆頂為k個數中最小的數;

/************************************/

//尋找在陣列中最大的k個數

//小頂堆插入

void constructheap(int a,int n,int value)

a[n] = temp;

}//堆更新

void updataheap(int a,int index,int n)

a[index] = temp;

}void maxk(int a,int n,int k)

a[n] = temp;

}//堆更新

void updataheap1(int a,int index,int n)

a[index] = temp;

}void getmaxk()

} }for (i=0;i

求陣列中最大的K個數

最容易想到的就是迴圈遍歷陣列k次求出最大的k個數。這個演算法有許多的缺點 第一點就是速度不夠,它的時間複雜度中o k n 當陣列很大時,不能全部載入到記憶體中,這個演算法就不可行了。這道題目還有兩種比較優的解法 1.我們可以利用快速排序中的思想,快速排序每次都把資料分為兩個部分,第一部分大於某個數,...

利用K 堆求最大的K個數

1.原理 1.1將資料存在陣列中,利用堆排排序陣列的前k個數 遞增 此時建立的是小堆,陣列的第乙個元素儲存堆中最小值。1.2從 k 1 個陣列元素遍歷到最後,每次都和堆頂元素對比,如果大於堆頂元素,交換兩者,調整堆。1.3輸出陣列前k個數,就是最大的k個數。include define k 3 vo...

求陣列中連續k個數最大值

變式題求數列中第k大的數 前k大問題 給定乙個長度為n陣列,求每個連續k個數的最大值,複雜度要求o n log k 解釋 例如陣列為 1,3,2,4,5 k 2,則連續k個數的區間有 1,3 3,2 2,4 4,5 每個區間的最大值分別為3,3,4,5,所以輸出3,3,4,5 include usi...