堆排序:堆可以看成一棵完全二叉树。排序经常使用大顶堆。
//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;
}
}