堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值。(注意,这里对同兄弟结点没有要求)
堆排序的理念就是,利用大顶堆(小顶堆),用的完全二叉树的数据结构,根的数据是最大值(最小值),然后把根取出来,形成新的完全二叉树,但是堆可能不平衡,就需要再次排序堆,然后再取出根....
代码如下
堆排序比如要排序一个大小为10的数组 需要一个大小为11的数组 并且第一位为垃圾值 比如
a[3] = {1,2,3};
就需要一个a[4] = {-1,1,2,3};这样的数组
void Adjust(int *a,int s,int m)
{
int j,temp;
int temp = a[s];
for(j=2*s;j<=m;j=2*j)
{
if(j<m && a[j]<a[j++])
j++;
if(temp>a[j])//如果父节点比孩子大,就退出,否则就交换数值
break;
a[s] = a[j];
s = j;//指针指向孩子
}
a[s] = temp; //将原来的数值赋值给孩子;此时父节点比孩子的数值都大
}
void HeapSort(int a[],int n)
{
int i,temp;
for(i=n/2;i>0;i--)// 初始化堆
{
HeapAdjust2(a,i,n);
}
for(i=n;i>0;i--)//每次把堆的根节点取出来,再次初始化堆
{
temp = a[1];
a[1] = a[i];
a[i] = temp;
HeapAdjust2(a,1,i-1);
}
}