写在前面
前面有篇文章已经写了选择类排序、交换类排序和插入类排序(传送门),下面将介绍二路归并排序和基数排序。
二路归并排序
1、执行过程
原始序列:45 35 65 95 75 15 25
1)将原始序列看作是7个有序的含有一个关键字的子序列
子序列1:45
子序列2:35
子序列3:65
子序列4:95
子序列5:75
子序列6:15
子序列7:25
2)两两归并,形成若干个有序的二元组
{35,45} , {65,95} , {15,75} , {25}
3)再将这个序列当作若干个二元组的子序列
子序列1:35 45
子序列2:65 95
子序列3:15 75
子序列4:25
4)继续两两归并,形成若干个有序的四元组
{35,45,65,95} , {15 ,25 ,75}
5)最后只剩下两个子序列,再进行一次归并,就完成了整个二路归并排序,结果如下
15 25 35 65 75 95
2、算法代码
由执行过程可知,归并排序可以看作是一个分而治之的过程:先将整个序列分成两半,对每一半分别进行归并排序,将得到两个有序序列,然后将这两个序列合并成一个序列即可。
void mergeSort(int R[] , int low , int high){
if(low < high){
int mid = (low + high)/2;
mergeSort(R,low,mid);
mergeSort(R,mid+1,high);
merge(R,low,mid,high);//合并算法,将两个有序的序列合并成一段有序序列
}
}
3、性能分析
时间复杂度O(nlogn),空间复杂度O(n)
基数排序
1、执行过程
初始桶如下图所示:
原始序列:78 09 63 30 89 84 05 69 08 83
1)进行第一趟分配和收集,按最后一位分配,如:
78的最低位为8,放到桶8中,如下图所示:
09的最低位是9,放到桶9,如下图所示:
依次将原始序列的每个数放到桶中,结果如下图所示:
然后按照桶0到9的顺序,从桶下面收集关键字,结果为:
30 63 83 84 05 78 08 09 89 69
2)在第一趟排序的基础上,进行第二趟分配和收集,按照倒数第二位(本例中是第一位),结果如下图所示:
然后收集,结果为:
05 08 09 30 63 69 78 83 84 89
现在最高位有序,最高位相同的关键字最低位有序,于是整个序列有序,基数排序结束。
3、性能分析
时间复杂度:O(d(n+r)),空间复杂度O(r),其中,n为序列中关键字的个数,d为关键字的位数,r为关键字基的个数。