int a[] = {88,94,55,6,42,30,4,15,85,36,11,31}; int high = sizeof(a)/sizeof(a[0]); int k = 3; int heap[k-1]; topk(a,0,high-1,k,heap); for (int i = 0;i<k;i++){ printf("%d ",heap[i]); }
system("pause"); return0; }
// 向下调整函数 ,调整为小根堆
voidsift(int *a,int low,int high){ int temp = a[low]; int i = low; int j = 2*i+1; while (j<=high){ if (j<high && a[j+1]<a[j]){ j = j+1; } if (a[j]<temp){ a[i] = a[j]; i = j; j = 2*i+1; } else{ break; } } a[i] = temp ; } // 与大根堆sift函数类似,只是两处判断语句的地方换成了小于
inttopk(int *a,int low ,int high ,int k,int heap[]){ // 建堆(k大小) for (int i =(k-2)/2;i>=0;i-- ){ sift(a,i,k-1); } for (int i = 0;i<k;i++){ heap[i]= a[i]; } // 遍历数组,把符合要求的数放入到k大小的小根堆中 for (int i =k ;i<=high;i++){ if (a[i]>a[low]){ a[low] = a[i]; // a[low] 是k大小堆中最小的数 sift(heap,0,k-1); } } // 出数 for (int i = k-1;i>=0;i--){ int temp = heap[0]; heap[0] = heap[i]; heap[i] = temp ; sift (heap,0,i-1); } return heap[k-1];