#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; }
本文出自 “走得远.看的深” 博客,谢绝转载!
原文:http://2462852817.blog.51cto.com/11224080/1793113