题目:要求找出数据流中最大的5个数
思路:构建一个5个元素的最小堆,循环处理,每次和堆顶元素比较即可
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
inline void swap(int arr[], int i, int j)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
void min_heap(int arr[], int size, int i)
{
int l = 2*i+1;
int r = l + 1;
int idx = i;
if(l < size && arr[l] < arr[i])
idx = l;
if(r < size && arr[r] < arr[idx])
idx = r;
if(idx != i)
{
swap(arr, i, idx);
min_heap(arr, size, idx);
}
}
int main(int argc, char* argv[])
{
int in;
const int max_s = 5;
int arr[max_s];
memset(arr, 0, sizeof(arr));
while(scanf("%d\n", &in) == 1) //初始化最小堆
{
if(arr[0] < in)
{
arr[0] = in;
min_heap(arr, max_s, 0); //更新堆
}
}
for(int i = 0; i < max_s; i++) //输出结果
printf("%d\n", arr[i]);
return 0;
}