采用优先队列合并每一段:
- (((2 ^ 2) ^2) ^2 ^2) …=n,则2^(2 ^x)=n,x=loglog(n),共有loglog(n)层。
- 采用优先队列合并的时候,优先队列要是局部变量。全部变量就乱了我没写也不想去写。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],p[N];
struct node{
int val,x,y;
bool operator<(const node & A)const{
return val>A.val;
}
};
void sort(int l,int r){
if(l==r) return;
priority_queue<node>q;
int d=sqrt(r-l+1);
for(int i=l,j=l;i<=r;i=j+1){
j=min(i+d-1,r);
sort(i,j);
q.push((node){a[i],i,j});
}
int k=l;
while(!q.empty()){
node cur=q.top();q.pop();
int i=cur.x,j=cur.y;
p[k++]=cur.val;
if(i+1<=j) q.push((node){a[i+1],i+1,j});
}
for(int i=l;i<=r;++i) a[i]=p[i];
}
int main(){
int n;cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
sort(1,n);
for(int i=1;i<=n;++i) cout<<a[i]<<" ";
puts("");
}