大家可能都在为一道排序的题而苦恼,用冒泡排序不行,sort也不能水过,那我们就可以用归并排序来解决。
归并排序(MERGE-SORT)是建立在归并排序导航的一种有效的排序方法,该算法是分治法非常典型的应用。将已有的子序列合并,得到完全有序的序列;即先使每个有序子序列有序,再使子序列段有序。若两个有序表合二为一成为一个有序表,称为二路归并。
归并操作也叫归并算法 ,指将两个有序序列合并成一个序列的方法。
归并排序时间复杂度为O(N*log N),空间复杂度为O(N) .
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 6e5+5;
int n,mid,a[N],tmp[N];
long long ans = 0;
void merge(int left,int mid,int right){
int i = left,j = mid+1,k = left;
while(i<=mid && j<=right){
if(a[i]>a[j]){
tmp[k++] = a[j++];
}
else{
tmp[k++] = a[i++];
}
}
while(i<=mid) tmp[k++] = a[i++];
while(j<=right) tmp[k++] = a[j++];
for(int z = left ; z<=right ; z++){
a[z] = tmp[z];
printf("%d ",a[z]);
}
printf("\n");
}
void mergesort(int left,int right){
if(left >= right) return ;
int mid = (left+right)/2;
mergesort(left,mid);
mergesort(mid+1,right);
merge(left,mid,right);
}
int main()
{
scanf("%d",&n);
for(int i = 1 ; i<=n ; i++) scanf("%d",&a[i]);
mergesort(1,n);
for(int i = 1 ; i<=n ; i++) printf("%d ",a[i]);
return 0;
}