堆排序

来源:互联网 发布:杭州网络推广 编辑:程序博客网 时间:2024/06/17 01:05

堆排序是一个树形结构,它的特点是,在排序过程中,将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() ;
}