main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<time.h>
#define num 10000
#define k 10
//
void Swap(int* a, int* b)
{
int mid = *a;
*a = *b;
*b = mid;
}
//
void AdjustDown(int* arry, int loc, int n)
{
int parent = loc;
int child = parent * 2 + 1;
while (child <=n - 1)
{
if (child+1<n&&arry[child] > arry[child+1])//建小堆
child++;
if (arry[parent] > arry[child])
{
Swap(arry + child, arry + parent);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
//
void CreatNData(const char* file)
{
srand((unsigned int)time(0));
//随机给文件内写入num个数
FILE* fin = fopen(file, "w");
assert(fin);
for (int i = 0; i < num; i++)
{
fprintf(fin, "%d\n", rand() % 1000 + 1);//1到1000
}
fclose(fin);
}
void PrintTopk()
{
int arry[k];
FILE* fout = fopen("data.txt", "r");
for (int i = 0; i < k; i++)//读入堆
{
int mid = fscanf(fout, "%d", arry + i);
if (mid == EOF || mid < 1)
{
perror("fscanf1");
exit(-1);
}
}
//向下调整建堆
for (int parent = (k - 2) / 2; parent >= 0; parent--)//最后节点的父节点就是最后的非叶子节点
{
AdjustDown(arry, parent, k);
}
//读入插入
int n;
while (fscanf(fout, "%d", &n) == 1)
{
if (n > arry[0])
{
arry[0] = n;
AdjustDown(arry, 0, k);
}
}
assert(feof(fout));
for (int i = 0; i < k; i++)
printf("%d ", arry[i]);
fclose(fout);
printf("\n");
}
int main()
{
const char* file = "data.txt";
CreatNData(file);
//找最大k个数
PrintTopk();
return 0;
}