二路归并排序和基数排序

写在前面

       前面有篇文章已经写了选择类排序、交换类排序和插入类排序(传送门),下面将介绍二路归并排序和基数排序。

二路归并排序

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为关键字基的个数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值