AcWing 787. 归并排序
原题链接
简单
作者:
川@木子
,
2020-09-04 18:41:23
,
所有人可见
,
阅读 1
#include<iostream>
#include<stdio.h>
using namespace std;
const int N=1e5+10;
int n;
int a[N],b[N];
void merge_sort(int q[],int l,int r){
//违规操作
if(l>=r)return ;
//中间数
int mid = (l+r)>>1;
//归并排序左半边
merge_sort(q,l,mid);
//归并排序右半边
merge_sort(q,mid+1,r);
int k=0,i=l,j=mid+1;
//左右半边逐个比较
while(i<=mid&&j<=r){
//优先将小的放到前面
if(q[i]<q[j]){
b[k]=q[i];
i++;
}else{
b[k]=q[j];
j++;
}
k++;
}
//当左边还剩没有排序的时候
while(i<=mid){
b[k]=q[i];
k++;
i++;
}
//当右边还剩没有排序的时候
while(j<=r){
b[k]=q[j];
k++;
j++;
}
//将排序好的数组放到原数组中
for(i=l,j=0;i<=r;i++,j++){
q[i]=b[j];
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
//归并排序算法
merge_sort(a,0,n-1);
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}