堆排序

来源:互联网 发布:java线程和进程的区别 编辑:程序博客网 时间:2024/05/18 03:13

堆排序:堆可以看成一棵完全二叉树。排序经常使用大顶堆。

 //write by daisong 2007 11 24 堆排序  建立堆,调整为大顶堆,输出堆顶的元素,继续调整为大顶堆
#include "iostream.h"

void heapfy(int a[],int low,int high)//调整为大顶堆,除了a[low]外,其余结点满足堆的性质
{
 int x,j;
 x= a[low];                 //暂存调整结点
 for( j= 2*low;j<=high;j=j*2)
 {                        //沿关键字较大的结点向下筛选,low为当前调整结点的下标
  if(j<high && a[j] <a[j+1])
   j++;             //j为当前结点孩子中结点字较大的记录下标
  if(x>a[j])           //如果当前结点不小于其孩子结点的关键字
   break;           //结束调整
  a[low] = a[j];       //将孩子结点关键字大的上调
  low =j;              //继续向下筛选
 }
 a[low]= x;               //把被调整点放入最终的位置上

}

void buildheap(int a[],int n)
{
 for(int i=n/2;i>0;i--)
  heapfy(a,i,n);       //将a[1.....n]调整为堆
}

void heapsort(int a[],int n)
{
 int temp;
 buildheap(a,n);          //建立大顶堆
 for (int i =1;i<=n;i++) //进行n-1趟排序
 {
  {
   temp = a[n-i+1]; //交换堆顶和堆中最后一个记录
            a[n-i+1] =a[1];
   a[1] = temp;
  }
  heapfy(a,1,n-i);      //调整a[1....n-1]为堆
 }
}

void main()
{
 int a [11] ={0,2,3,5,7,8,1,4,9,10,6};
 heapsort(a,10);
 for (int i=1;i<11;i++)
 {
  cout<<a[i]<<endl;
 }
}

 
原创粉丝点击