归并排序
一、O(nlogN)和 O(n^2)的时间效率对比
二、归并排序的实现过程
过程:分组,组内排序
法一:递归实现
//将arr[l...mid]和arr[mid+1...r]两部分进行归并
template<typename T>
void __merge(T arr[],int l,int mid,int r){
//1.已知两个有序的数组,想变成一个有序的数组,并且希望时间复杂度是O(n)
//2.这是一个比较困难的事,但是可以通过空间置换,
//step1:复制数组,两个相同数组,三个指标:k最终指向的位置,i,j分别指向两个有序数组的第一个
// 2:对比i,j的大小,小的复制到k
//复制数组
T aux[r-l+1];
for(int i = l;i<=r;i++){
aux[i-l] = arr[i];
}
int i = l,j = mid + 1;
for(int k = l; k <= r; k++){
//防止越界
if(i > mid){
arr[k] = aux[j-l];
j++;
}else if(j > r ){
arr[k] = aux[i-l];
}else if(aux[i-l] < aux[j-l]){
arr[k] = aux[i-l];
i++;
}else{
arr[k] = aux[j-l];
j++;
}
}
}
//递归使用归并排序,对 arr[l...r]进行排序
template<typename T>
void __mergeSort(T arr[],int l,int r){
if(l > r){
return;
}
//***优化2:如果数量级较小的情况下,因为前面的系数,归并算法有递归损失,插入算法反而更有效
if(r-l <= 15){
insertSort(arr,l,r);
return;
}
int mid = (l + r)/2;
__mergeSort(arr,l,mid);
__mergeSort(arr,mid+1,r);
//***优化1:
if(arr[mid] > arr[mid+1]){
__merge(arr,l,mid,r);
}
}
template<typename T>
void mergetSort(T arr[],int n){
__mergeSort(arr,0,n);
}
实现过程:归并排序算法有两个基本的操作,一个是分,也就是把原数组划分成两个子数组的过程。另一个是治,它将两个有序数组合并成一个更大的有序数组。
三、自下向上-2路
四、三路归并排序