您的位置:首页 > 其它

排序——堆排序

2016-04-14 13:34 225 查看
  以下是自己写的堆排序源码,已经测试通过,以后有时间总结,

#include<stdio.h>
//堆a,存储在数组a[len]中,根节点下标为i,len为数组长度
//该函数的作用是保持最大堆的性质
void Keep(int *a,int len,int i);
void Build(int* a,int len);
void Sort(int* a,int len);
void Keep(int *a,int len,int i)
{
int left=2*i+1;
int right=2*i+2;
int largest=i,temp;
if(left<len&&a[left]>a[i])
largest=left;
if(right<len&&a[right]>a[largest])
largest=right;
if(largest!=i)
{
temp=a[i];
a[i]=a[largest];
a[largest]=temp;
Keep(a,len,largest);
}
}
//建堆:通过一个数组建立最大堆
void Build(int* a,int len)
{
int i;
for(i=len/2-1;i>=0;i--)
Keep(a,len,i);
}
//堆排序
void Sort(int* a,int len)
{
int temp,i;
Build(a,len);
for(i=len-1;i>=1;i--)
{
temp=a[i];
a[i]=a[0];
a[0]=temp;
printf("%d %d\t",a[0],a[i]);
len--;
Keep(a,len,0);

}
printf("\n");
}
int main()
{
int len=10;
int a[len];
for(int i=0;i<len;i++)
scanf("%d",&a[i]);
Build(a,len);
Sort(a,len);
for(int i=0;i<len;i++)
printf("%d ",a[i]);

return 0;
}


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