堆排序算法
/*
首先说一下堆的性质:
1,它是一个完全二叉树
2,每个节点的值小于等于左右孩子节点的
值称为小根堆,反之为大根堆
3,对于节点i,左孩子为2i,右孩子为2i+1
(如果有的话)
堆排序的思想:
将待排序的序列构造成一个大根堆。此时,整个
序列的最大值就是堆顶的根节点。将它与堆数组的
末尾元素交换,此时末尾元素就是最大值,然后
将剩余的n-1个序列重新构造成一个堆,如此反复
就能得到一个有序序列。
*/
#include<cstdio>
#define MAX 1000
typedef struct SeqList
{
int Array[MAX];
int length;
}SeqList;
void Swap(SeqList *L,int i,int j)
{
int temp=L->Array[i];
L->Array[i]=L->Array[j];
L->Array[j]=temp;
}
void HeapAdjust(SeqList *L,int s,int len)
{
int temp,j;
temp=L->Array[s];
for(j=2*s;j<=len;j=j*2)
{
if(j<len&&L->Array[j]<L->Array[j+1])//如果左孩子<右孩子,记录右孩子
j++;
if(temp>=L->Array[j])//应该在S处插入
break;
L->Array[s]=L->Array[j];
s=j;
}
L->Array[s]=temp;
}
void HeapSort(SeqList *L)
{
int i;
for(i=L->length/2;i>0;i--)
HeapAdjust(L,i,L->length);//把Array构造成一个大根堆
for(i=L->length;i>1;i--)
{
Swap(L,1,i);//与末尾元素交换
HeapAdjust(L,1,i-1);//将剩余元素构造成一个大根堆
}
}
int main(int argc,char *argv[])
{
int i,n;
SeqList L;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&L.Array[i]);
L.length=n;
HeapSort(&L);
printf("After sort:\n");
for(i=1;i<=L.length;i++)
printf("%4d",L.Array[i]);
printf("\n");
return 0;
}