#include <stdio.h>
#include <math.h>
int a[1005];
int ret[1005];
void Dfs(int left,int right,int root);
int Find(int x);
int main()
{
int n,temp;
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)//读入数据
scanf("%d",&a[i]);
for(i=0;i<n;i++) //排序
for(j=i+1;j<n;j++)
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
Dfs(0,n-1,0);//实为分治,即找出0到n-1的根,存到ret里,不断找即可
for(i=0;i<n;i++)
{
printf("%d",ret[i]);
if(i!=n-1)
printf(" ");
}
}
void Dfs(int left,int right,int root)
{
if(left==right)
{
ret[root]=a[left];
return ;
}
int m=Find(right-left+1);//找出左子树大小,数学推导一下即可
ret[root]=a[m+left];
if(m+left-1>=left)//继续搜
Dfs(left,m+left-1,2*root+1);
if(right>=m+left+1)
Dfs(m+left+1,right,2*root+2);
}
int Find(int x)
{
float temp=log2(x);
int m=(int)temp;
int q=pow(2,m);
int p=pow(2,m-1);
q=(x-q+1)>=p? p:(x-q+1);
return (p-1+q);
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交