合并排序(归并排序):递归调用,对左边进行分组->对右边进行分组->分组完进行合并
平均时间复杂度为O(nlogn)
#include<iostream>
using namespace std;
int a[1001];
int merge[1001];
void Merge(int merge[],int a[],int left,int right,int middle){ //合并两个相邻子数组
int i=left;
int j=middle+1;
int k=left;
while(i<=middle&&j<=right){
if(a[i]>a[j]){
merge[k++]=a[j++];
}
else {
merge[k++]=a[i++];
}
}
while(i<=middle){
merge[k++]=a[i++]; //剩余的放入merge[]中
}
while(j<=right){
merge[k++]=a[j++]; //剩余的放入merge[]中
}
for(int m=left;m<=right;m++){ //更新a[m]
a[m]=merge[m];
}
}
void MergeSort(int a[],int left,int right){ //合并排序算法
if(left<right){
int middle=(left+right)/2;
MergeSort(a,left,middle); //对左边递归分组
MergeSort(a,middle+1,right); //对右边递归分组
Merge(merge,a,left,right,middle); //合并
}
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
MergeSort(a,0,n-1);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return 0;
}
输入:
5
2 3 8 1 6
输出:
1 2 3 6 8