堆排序是一个树形结构,它的特点是,在排序过程中,将R[0,,,n]看成一个完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大或最小的记录。
#include "stdio.h"
void HeapSort( int r[],int n)
{
int i;
int temp;
for(i=n/2;i>=0;i--) /*循环建立初始堆*/
sift(r,i,n);
for(i=n;i>=1;i--)
{
temp=r[0];/*将第一个元素同当前区间内r[0]交换*/
r[0]=r[i];
r[i]=temp;
sift(r,0,i-1); /*筛r[0]结点,得到i-1个结点的堆*/
}
}
int sift(int r[],int low,int high)
{
int i=low,j=2*i;/*r[j]是r[i]的左孩子*/
int temp=r[i];
while(j<=high)
{
if((j<high)&&(r[j]<r[j+1])) /*若右孩子大,把j指向右孩子*/
j++;
if(temp<r[j])
{
r[i]=r[j]; /*将r[j]调整到双亲结点的位置上*/
i=j;
j=2*i; /*修改i,j值,以便继续向下筛选*/
}
else
break; /*筛选结束*/
}
r[i]=temp; /*被筛结点的值放入最终位置*/
}
void main()
{
int i;
int arry[]={8,9,6,4,2,3,1,5,7};
HeapSort(arry,8);
for(i=0;i<=8;i++)
{
printf("%d",arry[i]);
}
getch() ;
}