堆排序的核心思想是建堆并调整
所以最重要的是写出调整函数
代码如下
#include <stdio.h>
void swap(int*a,int*b)
{
int temp=*b;
*b=*a;
*a=temp;
}
void sift(int a[],int low,int high)//调整函数
{
//a[]列表
//low 堆的根节点位置
//high 堆的最后一个元素位置
int i,j,tmp;
i=low;//i最开始指向根节点
j=2*i+1;//j开始是左节点
while(j<=high)
{
if((j+1<=high)&&(a[j+1]>a[j]))//若子节点有,则比较两个子节点选择最大的
j=j+1;//j指向右子节点
if(a[i]>a[j])//若父节点大于子节点则调整完毕,跳出函数
return;
else//否则交换父子节点内容,再继续子节点与孙子节点比较
{
swap(&a[i],&a[j]);
i=j;
j=i*2+1;
}
}
}
void heap_sort(int a[],int n)
{
int i;
for(i=n/2-1;i>=0;i--)//i表示建堆时调整的部分的根的下标
{
sift(a,i,n-1);//建堆完成
}
for(i=n-1;i>0;i--)
{
//i指向当前堆的最后一个元素
swap(&a[0],&a[i]);
sift(a,0,i-1);//i-1是新的high
}
}
int main()
{
int a[100],n;
printf("请输入需要排序的数字的数量:");
scanf("%d",&n);
printf("输入若干个数字:");
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
heap_sort(a,n);
for(int j=0;j<n;j++)
{
printf("%d ",a[j]);
}
return 0;
}