#include<stdio.h>
void exchange(int *m,int *n)//交换
{
int tem = *m;
*m = *n;
*n =tem;
}
void max_heap_adjust(int a[],int length,int i)//堆维护
{
int l = 2*i+1;
int r = 2*(i+1);
int largest = i;
if(l<= (length-1) && a[i]<a[l])
{
largest = l;
}
if(r<= (length-1) && a[largest]<a[r])
{
largest = r;
}
if( largest != i)
{
exchange(&a[largest],&a[i]);
max_heap_adjust(a,length,largest);
}
}
void build_max_heap(int a[],int length)//建堆
{
for(int i=(length-1)/2;i>=0;i--)
{
max_heap_adjust(a,length,i);
}
}
void heap_sort(int a[],int length)//堆排序
{
int n = length;
build_max_heap(a,length);
for(int j=0;j<5;j++)
{
printf("%d... ",a[j]);
}
for(int i=length-1;i>=0;i--)
{
printf(" a[%d] = %d,a[0]= %d",i,a[i],a[0]);
exchange(&a[i],&a[0]);//将堆首元素(最大的元素)依次交换到数组的后面去
}
}
int main()
{
int length = 5;
int a[5]={5,3,17,10,84};
heap_sort(a,5);
printf(" \n");
for(int i=0;i<5;i++)
{
printf("%d ",a[i]);
}
getchar();
return 0;
}堆排序主要工作都在建堆、堆维护,最后的排序阶段其实还是比较简单的。就好像是出栈。
31万+

被折叠的 条评论
为什么被折叠?



