归并排序

#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;
}

  

posted @ 2022-01-20 00:02  zzq12138  阅读(21)  评论(0)    收藏  举报