堆排序
构建小顶堆,其思路是构建前K个小顶推后, 数组的K+1 往后只需和堆顶元素比较,若是比之小则跳过,大于则替换,重新构建前K个小顶推,以此反复便能找到数组中前K个最大的数。
#include <stdio.h>
#define K 7
#define N 16
//堆排序:
void HeapAdjust( int *heap , int beginindx , int endindx ) {
heap[0] = heap[beginindx]; // Heap[0] 作为哨兵
for ( int i = 2* beginindx ; i <= endindx ; i*2 )
{
if( i<endindx && heap[i]>heap[i+1] ) //左节点和右节点比较
{
i++; //取key值较小的节点
}
if ( heap[0] < heap[i] ) // 筛选结束,直接就符合小顶堆的要求
break;
else {
heap[beginindx] = heap[i]; // 否则替换位置,并修改beginindx 值,继续向下筛选
beginindx = i;
}
}
heap[beginindx] = heap[0]; //将筛选好的节点值放入最终位置
}
void HeapConstruct( int *heap )
{
int i;
for( i=K/2 ; i>0 ; i-- ) { //从i=[n/2] ~ 1 反复调整
HeapAdjust( heap , i , K );
}
}
int main() {
int i;
int h[N] = { 11, 23, 4, 24 ,13 ,56, 34 ,25 , 90 , 5 ,14 ,44 ,66 ,8 ,42 ,53 };
HeapConstruct(&h);
for ( i = K +1 ; i <= N ; i++ )
{
if( h[i] > h[1])
{
h[1] = h[i];
HeapAdjust(h, 1 ,K);
}
}
for ( i = 0 ; i < k ; i++ )
printf(" %d " , h[i]);
printf("\n");
return 0;
}