您的位置:首页 > 编程语言 > C语言/C++

经典排序——堆排序——C语言版

2017-05-10 15:52 330 查看
/*堆排序*/
/*利用数组实现完全二叉树,通过比较左孩子,右孩子和父亲结点的大小,将最小的与父亲节点交换,从而使得最小的一直向上移动。完成一次后将最末尾的节点值移动到最顶,重复前面操作,每次都使得最小的到顶端,并取出*/
#include<stdio.h>

int heap_adjust(int s[],int i,int max)
{
int temp,lchild,rchild,k;
temp=s[i];
lchild=2*i+1;
rchild=lchild+1;
while(lchild<=max)
{
if(rchild<=max && s[lchild]>s[rchild])
{
k=rchild;
}
else
{
k=lchild;
}
if(s[k]<s[i])
{
s[i]=s[k];
s[k]=temp;
}
i++;
lchild=2*i+1;
rchild=lchild+1;
}
return *s;
}

int heap_build(int s[],int max)
{
int i;
for(i=(max-1)/2;i>=0;i--)
{
heap_adjust(s,i,max);
}
return *s;
}
int heap_sort(int s[],int max)
{
int i;
int h[max];
heap_build(s, max);

h[0]=s[0];
for(i=0;i<max;i++)
{
s[0]=s[max-i];
heap_adjust(s,0,max-i-1);
h[i+1]=s[0];
}
for(i=0;i<=max;i++)
{
s[i]=h[i];
}
return *s;
}

int main()
{
int s[5];
int n,i;
n=5;
for(i=0;i<n;i+
4000
+)
{
scanf("%d",&s[i]);
}
*s=heap_sort(s,n-1);
for(i=0;i<n;i++)
{
printf("%d ",s[i]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: