//堆排序算法
#include<stdio.h>
int a[101]; //假设待排序数少于100
void heap(int a[],int n); //将无序数组置大顶堆
void max_heap(int a[],int n,int i); // 调大顶堆
void heapsort(int a[],int n); //堆排序
void main()
{
int i,count=1;
printf("输入待排序数:\n");
scanf("%d",&a[count++]);
while(a[count-1]!=-1)
scanf("%d",&a[count++]);
count-=2;
heap(a,count);
heapsort(a,count);
for(i=1;i<=count;i++)
printf("%3d",a[i]);
printf("\n");
}
void max_heap(int a[],int n,int i) //假设除了根节点,左右子数均为大顶堆
{
int large=2*i;
if(large<=n&&a[large]<a[large+1])
large++;
if(large<=n&&a[i]>a[large])
large=i;
if(large!=i&&large<=n) //必须加large<=n,不然递归无出路
{
int temp;
temp=a[large];
a[large]=a[i];
a[i]=temp;
max_heap(a,n,large);
}
}
void heap(int a[],int n)
{
int i;
for(i=n/2;i>0;i--)
max_heap(a,n,i);
}
void heapsort(int a[],int n)
{
int i,temp;
for(i=n;i>1;i--)
{
temp=a[1];
a[1]=a[i];
a[i]=temp;
max_heap(a,i-1,1);
}
}
堆排序
最新推荐文章于 2024-08-06 00:07:38 发布