归并排序复杂度O(nlogn),其中分级操作复杂度为logn,排序复杂度为n。
归并排序思路:
将数组分为左右两部分,分别对两部分进行排序后再归并。递归地执行此操作。
#include <iostream>
using namespace std;
template<typename T>
void merge(T arr[],int left,int mid,int right){
T i_arr[right-left+1];//辅助空间,
for(int i=left;i<=right;i++)
i_arr[i-left] = arr[i];//空间是从left开始,这是拷贝数组的过程
int i=left,j=mid+1;
for(int k=left;k<=right;k++){
if(i>mid){//判断i是否已经越界
arr[k] = i_arr[j-left];
j++;
}
else if(j>right){//判断j是否已经越界。
//如果j已经越界,但K还没到达终点,则直接将左半部分剩余元素放入数组中。
arr[k] = i_arr[i-left];
i++;
}
else if(i_arr[i-left]<i_arr[j-left]){
arr[k]=i_arr[i-left];
i++;
}
else{
arr[k] = i_arr[j-left];
j++;
}
}
} //归并
template<typename T>
void mergeSort(T arr[],int left,int right){
if(left>=right)
return;
int mid = (left+right)/2;
mergeSort(arr,left,mid);
mergeSort(arr,mid+1,right);
merge(arr,left,mid,right);
}//分级
template<typename T>
void MergeSort(T arr[],int n){
//递归
mergeSort(arr,0,n-1);
}