/* 求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...