写在前面

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

二路归并排序

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. 数据结构——二路归并排序和基数排序

    二路归并排序 算法原理 假设该数组为q,左边界为 l,右边界为 r,并设置临时数组tmp. 采用分治思想: 第一步:确定分界点: mid = l + r >>1. 第二步:递归划分左右两段 ...

  2. 数据结构源码笔记(C语言):二路归并排序

    //实现二路归并排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20 //线性表中最多元素个数typedef int ...

  3. 数据结构——排序:插入排序、选择排序、交换排序、归并排序、基数排序

    排序 内部排序:数据量不大,在内存中可以完成排序. 外部排序:借助外存.把数据文件分成若干块,涉及内外存数据的转换.存储器的管理等. 稳定排序:能保证排序前两个相等的数其在序列的前后位置顺序和排序后它 ...

  4. 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

    掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...

  5. 【Java数据结构与算法】第八章 快速排序、归并排序和基数排序

    第八章 快速排序.归并排序和基数排序 文章目录 第八章 快速排序.归并排序和基数排序 一.快速排序 1.基本介绍 2.代码实现 二.归并排序 1.基本介绍 2.代码实现 三.基数排序 1.基本介绍 2 ...

  6. 二路归并排序简介及其并行化

    1.归并排序简介 1.1算法思想 归并排序属于比较类非线性时间排序,比较类排序中性能最佳,应用较为广泛. 归并排序是分治法(Divide and Conquer)的一个典型的应用.将已有序的子序列合并 ...

  7. 插入排序、希尔排序(Shell)、选择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序(桶排)的 时间复杂度和空间复杂度

    插入排序 希尔排序(Shell) 选择排序 堆排序 冒泡排序 快速排序 归并排序和基数排序(桶排) 的 时间复杂度(平均情况.平均情况和最坏情况)和 空间复杂度. 排序方法 名称 是否需要 比较关键字 ...

  8. 排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序)

    排序也叫排序算法,排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类: 1)内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序. 2)外部排序:数据量过大,无法全部加载到内存中,需要 ...

  9. C++实现二路归并排序算法

    排序算法分为五大类,一共是有九种,如下: 插入类:直接插入排序.折半插入排序.希尔排序 交换类:冒泡排序.快速排序 选择类:简单选择排序.堆排序 归并类:二路归并排序 基数类:多关键字排序 九种算法的 ...

  10. 二路归并排序原理及JAVA实现

    归并类排序 基本思想:首先将原始无序序列划分为两个子序列,然后分别对每个子序列递归地进行排序,最后再将有序子序列合并. 归并排序基于分治策略思想.前面提到的基于分治的快速排序重在"分&quo ...

最新文章

  1. python实现字符串切割
  2. dnet 并行编程学习总结
  3. 遇到“BUG: soft lockup - CPU#0 stuck for 22s”的解决思路
  4. 【PAT乙级】1054 求平均值 (20 分)
  5. Android安卓程序开发的权限设置
  6. mysql数据库读写操作_一看就会,MySQL数据库的基本操作(二)
  7. JAVA企业级应用TOMCAT实战视频课程
  8. 助你成为嵌入式高手的100多个软硬件开源项目
  9. inetd -- internet超级服务器
  10. [转]JavaScript 删除数组中指定值的元素
  11. AJAX解惑篇(转)
  12. HCIE Security 防火墙带宽管理 备考笔记(幕布)
  13. RxJava学习总结
  14. linux运维零基础学习,没有基础怎么学习Linux运维?Linux学习
  15. 网站在移动端访问时偶尔不能加载页面,http访问被劫持
  16. 《软件工程导论》期末复习知识总结
  17. 网络基础3【网络层、数据链路层】
  18. Solidity 生成Java类
  19. 用excel来构建柯布-道格拉斯Cobb-Douglas生产函数的可视化
  20. 计算机电源已接通但未充电,笔记本电源,详细教您电源已连接未充电怎么解决...

热门文章

  1. 超市不同时段人流量统计分析
  2. 3DMAX渲染慢?一些小方法提升3DMAX渲染速度~
  3. 冲顶,百万答题助手改进(python)
  4. 金山词霸2009牛津版完整破解版+绿色精简版下载
  5. 用ps制作LOGO(个人向)
  6. 总数量超过五十个,史上最全的爬虫项目集合
  7. 步进电机原理及参数详解
  8. Web渗透测试实战:基于Metasploit 5.0
  9. snownlp 原理_snownlp入门
  10. pscc2019滤镜抽出_ps抽出滤镜(Extractplus.8bf)下载_ps抽出滤镜(Extractplus.8bf)官方下载-太平洋下载中心...