您的位置:首页 > 其它

算法入门--堆排序2(建立最小堆,从大到小)

2011-11-24 17:18 295 查看
#include <stdio.h>
#include <stdlib.h>
int left(int i)//返回左孩子位置
{
return 2*i;
}
int right(int i)//返回右孩子位置
{
return 2*i+1;
}
void min_heapify(int *a,int heap_size,int i)//保持堆性质,使以i为根的子树成为最小堆 ,heap_size当前堆中元素数量
{
int l,r,least;
int temp;
l=left(i);
r=right(i);
if(l<=heap_size&&a[l]<a[i])
least=l;
else
least=i;
if(r<=heap_size&&a[r]<a[least])
least=r;
if(least!=i)
{
temp=a[i];
a[i]=a[least];
a[least]=temp;
min_heapify(a,heap_size,least);
}
}
void build_min_heap(int *a,int length)//建立最小堆
{
int i,heap_size;
for(i=length/2;i>=1;i--)
min_heapify(a,length,i);
}
void heap_sort2(int *a,int length)//堆排序,从大到小 ,length为堆中元素数量
{
int heap_size=length;
int i,temp;
build_min_heap(a,length);//建立最小堆
for(i=length;i>=2;i--)
{
temp=a[i];
a[i]=a[1];
a[1]=temp;
heap_size--;
min_heapify(a,heap_size,1);//重新调整为最小堆
}

}
int main(int argc, char *argv[])
{
//  int a[11]={0,4,1,3,2,16,9,10,14,8,7};//测试数据
//int length=10;
int length;//数组中的堆的数据的长度
int a[100];
a[0]=0;
int i;
printf("请输入元素的数量:");
scanf("%d",&length);
printf("\n请依次输入%d个元素,空格结束:\n",length);
for(i=1;i<=length;i++)
scanf("%d",&a[i]);
printf("\n");
for(i=1;i<=length;i++)
printf("%d ",a[i]);
printf("\n------------------------\n");
printf("建立最小堆以后\n");
build_min_heap(a,length);
for(i=1;i<=length;i++)
printf("%d ",a[i]);
printf("\n");
printf("使用堆排序后:\n");
heap_sort2(a,length);
for(i=1;i<=length;i++)
printf("%d ",a[i]);
system("PAUSE");
return 0;
}








                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: