堆排序
梦里伊人
posted @ 2007年8月07日 23:15
in c语言笔记
, 1350 阅读
-
#include<stdio.h>
-
-
int k,j;
-
/* 建堆函数 */
-
void build(int *a,int i,int n)
-
{
-
int tmp;
-
k=i;
-
j=2*k+1;
-
while(j<=n)
-
{
-
if(j<n&&a[j]<a[j+1])
-
j++;
-
if(a[k]>=a[j])
-
break;
-
tmp=a[k];
-
a[k]=a[j];
-
a[j]=tmp;
-
k=j;
-
j=2*j+1;
-
}
-
}
-
/* 打印数组函数 */
-
void print(int *a,int n)
-
{
-
int i;
-
for(i=0;i<n;i++)
-
}
-
/* 打印堆函数 */
-
void printhp(int *a,int b1,int b2)
-
{
-
int size;
-
int h=0,sum=0,item=1;
-
int i,j,cnt,start,tmp;
-
size=b2-b1+1;
-
while(sum<=size)
-
{
-
sum+=item;
-
h++;
-
item*=2;
-
}
-
item=1;
-
cnt=0;
-
start=b1;
-
tmp=1;
-
while(1)
-
{
-
for(i=0;i<h;i++)
-
{
-
for(j=0;j<h-i;j++)
-
for(j=0;j<i+1;j++)
-
for(j=0;j<tmp;j++)
-
{
-
if(cnt>size-1)
-
goto end;
-
}
-
tmp*=2;
-
}
-
}
-
end:
-
return;
-
}
-
/* 打印已排序数组函数 */
-
void printar(int *a,int b2,int len)
-
{
-
int i;
-
for(i=0;i<b2;i++)
-
for(i=b2;i<=len;i++)
-
}
-
-
main()
-
{
-
int a[50];
-
int i,tmp,len;
-
scanf("%d",&len);
-
for(i=0;i<len;i++)
-
scanf("%d",&a[i]);
-
print(a,len);
-
/* 建初始堆 */
-
for(i=(len-1)/2;i>=0;i--)
-
build(a,i,len-1);
-
printhp(a,0,len-1);
-
/* 改建堆 */
-
for(i=0;i<len-1;i++)
-
{
-
tmp=a[0];
-
a[0]=a[len-1-i];
-
a[len-1-i]=tmp;
-
build(a,0,len-2-i);
-
printhp(a,0,len-2-i);
-
printar(a,len-1-i,len-1);
-
}
-
print(a,len);
-
}
-