堆排序:
1.将待排序记录按照堆的定义建初堆,并输出堆顶元素。
2. 调整剩余的记录序列,利用筛选法将前n-i个元素重新筛选建成一个新堆,在输出堆顶元素
3. 重复执行,进行n-1次筛选。
代码实现
#include<stdio.h>
#include<stdlib.h>
void sift(int r[],int k,int m)
{
int t;
int i,j;
bool finished=false;
t=r[k];
i=k;
j=2*k; //k的左孩子
finished=false;
while(j<=m && !finished)
{
if(j<m && r[j]<r[j+1])
{
j=j+1; //找到左右孩子中值最大的
}
if(t>=r[j])
{
finished=true;
}
else
{
r[i]=r[j];
i=j;
j=2*i;
}
}
r[i]=t;
}
//对记录数组r建堆,length为数组长度
void crt_heap(int r[],int length)
{
int n=length;
for(int i=n/2;i>=1;i--)
{
sift(r,i,n);
}
}
void HeapSort(int r[],int length)
{
int n=length;
int temp;
int i;
crt_heap(r,length);
for(i=n;i>=2;i--)
{
temp=r[1];
r[1]=r[i];
r[i]=temp;
printf("%d ",r[i]);
sift(r,1,i-1);
}
printf("%d ",r[1]);
}
void main()
{
int r[9]={0,98,77,35,62,48,55,14,35}; //排序数组下标从1开始算起,所以0下标元素用0代替
HeapSort(r,8);
// for(int i=0;i<8;i++)
// printf("%d ",r[i]);
printf("\n");
}