堆排序

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

 //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;
 }
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值