#include <stdio.h> //堆排序(大顶堆)
#include <stdlib.h>
#define MaxSize 50
#define MinSize 2
typedef struct // 堆的结构
{
int *nData; //存储堆元素
int nSize; //堆长度
}MyHeap;
//从堆的最后一个结点插入,依次向上(父节点)比较,调整合适位置退出
int InCreaseKey(MyHeap *pHeap,int nPos) //调整堆元素
{
int nParent,nTemp;
while ( nPos > 1 ) //从最后结点向上比较,最多到根节点
{
nParent = nPos/2;
nTemp = pHeap->nData[nPos];
if ( nTemp > pHeap->nData[nParent] ) //与父节点比较,大于就交换,小于退出
{
pHeap->nData[nPos] = pHeap->nData[nParent];
pHeap->nData[nParent] = nTemp;
nPos = nParent;
}
else
{
break;
}
}
return 1;
}
void Insert(MyHeap *pHeap,int data) //数据插入到堆中
{
++pHeap->nSize; //长度增加
pHeap->nData[pHeap->nSize] = data;
InCreaseKey(pHeap,pHeap->nSize);
}
int Pop(MyHeap *pHeap) //从堆中取出数据
{
int nChild,nMax,nTemp,nPos;
nMax = pHeap->nData[1];
nPos = 1;
nChild = nPos*2;
while ( nChild <= pHeap->nSize ) //由根节点开始,依次向孩子节点调整位置
{
nTemp = pHeap->nData[nChild];
if (nChild+1 <= pHeap->nSize && pHeap->nData[nChild+1] > nTemp)//右孩子大于左孩子
{
nChild++;
nTemp = pHeap->nData[nChild];
}
pHeap->nData[nPos] = nTemp;
nPos = nChild;
nChild *= 2;
}
pHeap->nData[nPos] = pHeap->nData[pHeap->nSize];
pHeap->nSize--;
return nMax;
}
int main(void)
{
int i,n,r,data;
MyHeap myHeap;
printf("请输入要排序的数字的个数(%d-%d): \n",MinSize,MaxSize);
scanf("%d",&n);
if ( n<MinSize || n>MaxSize )
{
do{
printf("请输入要排序的数字: (%d-%d)",MinSize,MaxSize);
scanf("%d",&n);
flushall();
}while ( !(n>=MinSize && n<=MaxSize) );
}
myHeap.nData = (int *)malloc(sizeof(int)*n);
myHeap.nSize = n;
printf("输入要排序的数字:\n");
for ( i=0 ; i<n ; )
{
r = scanf("%d",&data);
if ( r == 1 )
{
i++;
Insert(&myHeap,data);
}
else
{
printf("请输入数字:\n");
flushall();
}
}
for ( i=0 ; i<n ; i++ )
{
printf("%d==>",Pop(&myHeap));
}
printf("END\n");
getch();
return 0;
}
转载于:https://blog.51cto.com/2462852817/1793113