#include <bits/stdc++.h>
using namespace std;
typedef int LL;
const LL maxn = 100000 + 100;
LL a[maxn],b[maxn];
void mergesort( LL l,LL r ){
if( l >= r ) return;
LL mid = l + r >> 1;
mergesort( l,mid );
mergesort( mid+1,r );
LL ll = l,rr = mid+1;
LL cnt = 0;
while( ll <= mid && rr <= r ){
if( a[ll] <= a[rr] ){
b[++cnt] = a[ll];
ll++;
}else{
b[++cnt] = a[rr];
rr++;
}
}
while( ll <= mid ) b[++cnt] = a[ll++];
while( rr <= r ) b[++cnt] = a[rr++];
for( LL i = l;i <= r;i++ ){
a[i] = b[1+i-l];
}
}
int main()
{
LL n;
scanf("%d",&n);
for( LL i = 1;i <= n;i++ ){
scanf("%d",&a[i]);
}
mergesort( 1,n );
for( LL i = 1;i <= n;i++ ){
printf("%d ",a[i]);
}
return 0;
}
#include <cstdio>
#include <algorithm>
#define N 100005
using namespace std;
int n;
int a[N];
void Qsort(int l,int r){
if(l>=r) return;
int i=l,j=r,mid=a[(l+r)>>1];
while(i<=j) {
while(a[i]<mid)i++;
while(a[j]>mid)j--;
if(i<=j)swap(a[i++],a[j--]);
}
Qsort(l,j);Qsort(i,r);
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
Qsort(1,n);
for(int i=1;i<=n;i++) printf("%d ",a[i]);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
//插入a[i],创建堆
//第i个输入的数结点下标是i,往上浮
int xb=i;
while(xb>1&&a[xb]<a[xb/2]){
//交换
int k=a[xb];
a[xb]=a[xb/2];
a[xb/2]=k;
xb/=2;
}
}
// for(int i=1;i<=n;i++)cout<<a[i]<<endl;
//提取n次根
int jd=n;//结点总数为n
for(int i=1;i<=n;i++){
//做n次
//提取根
cout<<a[1]<<" ";//输出当前根
//提出最后一个作为新根
a[1]=a[jd];
jd--;
//往下沉
int xb=1;
while((xb*2<=jd&&a[xb]>a[xb*2])||(xb*2+1<=jd&&a[xb]>a[xb*2+1])){
int fx,lc=xb*2,rc=xb*2+1;
if(rc<=jd&&a[rc]<a[lc])fx=rc;
else fx=lc;
//交换
int k=a[xb];
a[xb]=a[fx];
a[fx]=k;
xb=fx;
}
// for(int i=1;i<=jd;i++)cout<<a[i]<<" ";
// cout<<endl;
}
return 0;
}
还有那些快排方法?