// 生成n条随机数据存入data.txtvoidCreateNData(int n){srand(time(0));
FILE* f =fopen("data.txt","w");if(!f){perror("fopen err");return;}for(int i =0; i < n; i++)fprintf(f,"%d\n",rand()%10000);fclose(f);}
3. TopK筛选主逻辑
// 从文件中找前k大元素voidPrintTopK(constchar* file,int k){// 1. 初始化k容量小顶堆int* topk =(int*)malloc(sizeof(int)*k);assert(topk);
FILE* f =fopen(file,"r");if(!f){perror("fopen err");free(topk);return;}// 读前k个元素建堆for(int i =0; i < k; i++)fscanf(f,"%d",&topk[i]);for(int i =(k-2)/2; i >=0; i--)AdjustDown(topk, k, i);// 2. 筛选剩余数据int val;while(fscanf(f,"%d",&val)!=EOF){if(val > topk[0]){// 新元素大则替换堆顶
topk[0]= val;AdjustDown(topk, k,0);}}// 3. 打印结果printf("前%d大元素:", k);for(int i =0; i < k; i++)printf("%d ", topk[i]);printf("\n");free(topk);fclose(f);}