归并排序
#include<iostream> using namespace std; const int N=100010; int q[N],tmp[N]; void mergesort(int q[],int l,int r){ if(l>=r) return; int mid=(l+r)/2; mergesort(q,l,mid),mergesort(q,mid+1,r);//先递归两边 int k=0,i=l,j=mid+1;//k代表合并后数组元素的下标,i和j是平分的两个区间的指针(从最左端开始) while(i<=mid&&j<=r)//当两个指针都没知道区间最右边时 if(q[i]<=q[j]) tmp[k++]=q[i++];//将两个区间中更小的数放在合并后的区间中,然后该区间的指针向后移一位 else tmp[k++]=q[j++]; //当其中的一个指针移到末尾后,如果另一个指针还未移到末尾, //直接将剩余的数全部追加到合并后的数组上。 while(i<=mid) tmp[k++]=q[i++]; while(j<=r) tmp[k++]=q[j++]; for(i=l,j=0;i<=r;i++,j++)//原数组下标从L开始是因为每次合并都要进行排序赋值 q[i]=tmp[j];//将合并后的数组赋给原数组 } int main(){ int n; cin>>n; for(int i=0;i<n;i++) cin>>q[i]; mergesort(q,0,n-1); for(int i=0;i<n;i++) cout<<q[i]<<" "; return 0; }