查詢n個數中最小的k個元素

2021-06-17 18:14:08 字數 1326 閱讀 7033

/* 求n個數中最小的k個元素(n很大,k相對較小)

* 建立乙個k個元素的堆:再逐個插入,最壞情況時間複雜度為o(nlgk)

*/#include /* 求左右葉子、父結點的巨集定義 */

#define left(i) ((i) * 2)

#define right(i) ((i) * 2 + 1)

#define parent(i) ((i) / 2)

/* 維持堆的性質

* 演算法原理:選取當前結點及其子結點3個中的最大值,

* 跟當前結點交換,並遞迴

*/void keep_max_heap(int *heap, int size, int i)

if (right(i) <= size && heap[right(i)] > heap[max])

if (i != max)

}/* 根據陣列建立堆

* 演算法原理:n/2個元素是第乙個非葉子結點,

* 從該元素往上逐漸調整堆,使之保持堆特性。

* 為方便,陣列第0號元素不用

*/void build_max_heap(int *heap, int size)

}/* 大根堆排序,從小到大 */

void max_heap_sort(int *heap, int size) //堆排序後從小到大輸出

}/* 列印堆元素 */

void print_heap(int *heap, int size)

printf("\n");

}/* 若發現在比大根堆最大值要小的元素,

* 則用該元素取代堆的根並使堆保持堆特性

*/void max_heap_replace(int *heap, int size, int value)

int main() ;

int b[100];

for (int i = 0; i < 100; i++)

int size = 10;//求0到k大的元素

build_max_heap(a, size);

print_heap(a, size);

for (int i = 0; i < 100; i++)

} max_heap_sort(a, size);

print_heap(a, size);

return 0;

}/* 結果為

78 69 67 62 64 24 34 58 5 7

1 2 3 4 5 5 6 7 7 8

*/

查詢陣列中最小k個數

思路 可採用大頂堆來實現 維護乙個規模為k的大頂堆。從前往後掃瞄陣列元素 若大頂堆的size小於k,則把當前元素插入大頂堆中 若小於k,若當前元素小於堆頂元素,則刪除堆頂元素,插入當前元素。考慮到從頭實現乙個大頂堆比較麻煩,這裡使用treeset容器,它提供有序的set。treeset底層實際使用的...

輸入n個整數,找出其中最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,牛客網題目鏈結 使用最大堆實現,1.構建大小為k的最大堆 2.如果新元素小於當前最大堆的堆頂元素,則替換堆頂,調整最大堆 3.題目要求按照從小到大順序輸出最小的k個數,所以最後需要...

輸入n個整數,找出其中最小的K個數。

題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,思路 可以使用排序 這裡我採用快排,獲取到乙個有順序的陣列,然後獲取它的前n個 先使用快排排序 public static void quicksort int arr,in...