#include <stdio.h>
/*
堆排序
*/
void duipaixu(int *,int len); //堆排序声明
void show(int *,int); //测试函数
void duipaixu(int *a,int len)
{
int i=len/2-1;
for(;i>=0;--i)
{
int n=i;
while((2*n+1)<len)
{
int j=2*n+1;
int m;
if((j+1)<len)
{
if(a[j+1]>a[j])
{
m=j+1;
}
else
{
m=j;
}
}
else
{
m=j;
}
if(a[m]>a[n])
{
int mid=a[n];
a[n]=a[m];
a[m]=mid;
n=m;
}
else
{
break;
}
}
}
i=len-1;
for(;i>=0;--i)
{
int mid=a[0];
a[0]=a[i];
a[i]=mid;
int j=i/2-1;
for(;j>=0;--j)
{
int n=j;
while((2*n+1)<i) //递归大根求解
{
int w=2*n+1;
int s;
if((w+1)<i)
{
if(a[w+1]>a[w])
{
s=w+1;
}
else
{
s=w;
}
}
else
{
s=w;
}
if(a[n]<a[s])
{
int mid=a[n];
a[n]=a[s];
a[s]=mid;
n=s;
}
else
{
break;
}
}
}
}
}
void show(int *a,int len)
{
int i=0;
for(;i<len;++i)
{
printf("%d\n",a[i]);
}
}
int main()
{
int a[]={7,8,9,0,2,3,4,5,6,1};
int len=sizeof(a)/sizeof(int);
duipaixu(a,len);
show(a,len);
}
/*
堆排序
*/
void duipaixu(int *,int len); //堆排序声明
void show(int *,int); //测试函数
void duipaixu(int *a,int len)
{
int i=len/2-1;
for(;i>=0;--i)
{
int n=i;
while((2*n+1)<len)
{
int j=2*n+1;
int m;
if((j+1)<len)
{
if(a[j+1]>a[j])
{
m=j+1;
}
else
{
m=j;
}
}
else
{
m=j;
}
if(a[m]>a[n])
{
int mid=a[n];
a[n]=a[m];
a[m]=mid;
n=m;
}
else
{
break;
}
}
}
i=len-1;
for(;i>=0;--i)
{
int mid=a[0];
a[0]=a[i];
a[i]=mid;
int j=i/2-1;
for(;j>=0;--j)
{
int n=j;
while((2*n+1)<i) //递归大根求解
{
int w=2*n+1;
int s;
if((w+1)<i)
{
if(a[w+1]>a[w])
{
s=w+1;
}
else
{
s=w;
}
}
else
{
s=w;
}
if(a[n]<a[s])
{
int mid=a[n];
a[n]=a[s];
a[s]=mid;
n=s;
}
else
{
break;
}
}
}
}
}
void show(int *a,int len)
{
int i=0;
for(;i<len;++i)
{
printf("%d\n",a[i]);
}
}
int main()
{
int a[]={7,8,9,0,2,3,4,5,6,1};
int len=sizeof(a)/sizeof(int);
duipaixu(a,len);
show(a,len);
}