一、归并排序
归并:把两个或多个已经有序的序列合并成一个
二路归并
四路归并
算法实现:
代码实现:
//归并排序 核心代码
void Merge(int A[],int low,int mid,int high,int B[]) {
int i=low;
int j=mid+1;
int k=low;
while(i<=mid && j<=high){ //将较小的值放入数组B中
if(A[i]>A[j]){
B[k]=A[j];
k++;
j++;
}else{ //确保稳定性
B[k]=A[i];
k++;
i++;
}
}
while(i<=mid){
B[k++]=A[i++];
}
while(j<=high){
B[k++]=A[j++];
}
}
// 归并排序 完整代码
void MergeSort(int A[],int low,int high,int B[]) {
int mid;
if(low<high){
mid =(low+high)/2; //从中间划分
MergeSort(A,low,mid,B); //对左半部分进行划分
MergeSort(A,mid+1,high,B); //对右半部分进行划分
Merge(A,low,mid,high,B); //归并
}
}
/*
* 时间复杂度::O(nlogn)
* 空间复杂度:O(n)
* 稳定性:稳定
*/
复杂度分析:
二路归并的归并树—形态上就是一棵倒立的二叉树
树高是h
归并的趟数是h-1趟
每一趟归并时间复杂度都在O(n)这个数量级,
空间复杂度O(n),来自于辅助数组B
稳定性:稳定
二、基数排序
基数排序不需要比较各个关键字元素的大小
第一趟分配+收集:
第二趟分配+收集:
第三趟分配+收集:
排序思想:
复杂度分析:
把关键字拆分成d个部分
每个部分可能取得r个值
稳定性: