template<typename T>
void insertionSort2(T arr[],int l,int r){
for(int i=l+1;i<=r;i++){
T e=arr[i];
int j;
for(j=i;j>l&&arr[j-1]>e;j--){
arr[j]=arr[j-1];
}
arr[j]=e;
}
return;
}
//归并排序每次除以2 如有8个元素 则有log(8)也就是三个层级 如果不是2的整数次幂则向上取整就好了。分层级是logn 归并的过程是n 所以nlogn 也就是二分法达到层级 每一个层级用O(n)的算法来做事情
template<typename T>
void __merge(T arr[],int l,int mid,int r){//将arr[l...mid]和arr[mid+1..r]两部分进行归并
T aux[r-l+1];//开辟出用于归并的辅助空间 大小等于arr的大小
for(int i=l;i<=r;i++){
aux[i-l]=arr[i];
}
int i=l;
int j=mid+1;
for(int k=l;k<=r;k++){
if(i>mid){//这一对if else是先判断索引的合法性
arr[k]=aux[j-l];
j++;
}
else if(j>r) {
arr[k]=aux[i-l];
i++;
}
else if(aux[i-l]<aux[j-l]){
arr[k]=aux[i-l];
i++;
}
else{
arr[k]=aux[j-l];
j++;
}
}
}
template<typename T>
void __mergeSort(T arr[],int l,int r){//递归使用归并排序,对arr[l ..r]的范围进行排序
// if(l>=r){
// return;
// }
if(r-l<=15){//使用插入排序优化,当数越小越可能趋近于有序 O(n)的插入排序
insertionSort2(arr,l,r);
return;
}
int mid=(l+r)/2;
__mergeSort(arr,l,mid);
__mergeSort(arr,mid+1,r);
if(arr[mid]>arr[mid+1]){
__merge(arr,l,mid,r);
}
}
template<typename T>
void mergeSort(T arr[],int n){
__mergeSort(arr,0,n-1);//(私有)子函数 用于递归排序
}
归并排序 递归思想 使用插入排序优化
最新推荐文章于 2022-05-31 10:42:36 发布