上两节讲解的几种排序方法不是时间复杂度大了,就是不稳定,今天我们讲一下一种时间复杂度低又稳定的一种内部排序方法;

归并排序
基本思想:将两个或两个以上的有序序列合并成一个新的有序序列:
有序序列V[1] …V[m]V[m+1] …V[n]

                        
                V[1] …V[n]
这种归并方法称为2路归并。

将3个有序序列归并为一个新的有序序列,称为3路归并。将多个有序序列归并为一个新的有序序列,称为多路归并。

利用归并的思想很容易实现排序,假设初始序列含有n个元素,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序序列;再两两归并,......,如此重复,直至得到一个长度为n的有序序列位置(如上描述,可以使用递归实现),这种排序方法称为2-路归并排序。

二路归并排序示例:

2-路归并排序中的核心操作是将一维数组中的前后相邻的两个有序序列归并为一个有序序列,其算法如下:

单趟归并实现代码如下:

// 归并函数
void Merge(int src[], int des[], int low, int mid, int high)
{int i = low;int j = mid + 1;       // 存放序列中间元素的下标int k = low;// 当i和j都在两个序列内变化时, 根据关键码的大小将较小的数据// 元素排放到新序列k所指位置中while( (i <= mid) && (j <= high) ){if( src[i] < src[j] ){des[k++] = src[i++];}else{des[k++] = src[j++];}}// 当i与j中有一个已经超出序列时,将另一个序列中的剩余部分照抄到新序列中while( i <= mid ){des[k++] = src[i++];}while( j <= high ){des[k++] = src[j++];}
}

递归归并排序代码:

// 归并排序
void MSort(int src[], int des[], int low, int high, int max)
{// 排序结束if( low == high ){des[low] = src[low];}else{int mid = (low + high) / 2;   // 确定中间值// 申请中间存储内存int* space = (int*)malloc(sizeof(int) * max);// 申请成功if( space != NULL ){// 排序MSort(src, space, low, mid, max);MSort(src, space, mid+1, high, max);// 归并Merge(space, des, low, mid, high);}// 是否内存free(space);}
}void MergeSort(int array[], int len) // O(n*logn)
{MSort(array, array, 0, len-1, len);
}

测试代码

int main()
{int array[] = {21, 25, 49, 25, 16, 8};int len = sizeof(array) / sizeof(*array); println(array, len);MergeSort(array, len);println(array, len);return 0;
}

从代码中我们发现,归并排序不仅需要递归,还得需要和待排元素等数量的辅助空间,这样的话就会占用太多的内存。各种排序方法各有利弊,可以根据实际情况斟酌使用。当然,排序算法不仅仅只有上面介绍的这些,还有其他的这里暂时不再一一说明,以后再讨论。

数据结构之内部排序三相关推荐

  1. SDUT 3400 数据结构实验之排序三:bucket sort

    数据结构实验之排序三:bucket sort Time Limit: 150MS Memory Limit: 65536KB Submit Statistic Problem Description ...

  2. 数据结构实验之排序三:bucket sort SDUT

    数据结构实验之排序三:bucket sort SDUT Time Limit: 250 ms Memory Limit: 65536 KiB Submit Statistic Problem Desc ...

  3. 数据结构之内部排序算法总结笔记

    内部排序算法  排序的基本概念: 把一组无序的数据元素按照关键字值递增(或递减)的顺序重新排列.  一.插入排序 思想:将序列分为[有序段]与[无序段]两段,然后依次将[无序段]中的元素插入到[有序段 ...

  4. 数据结构之内部排序一

    排序算法演示动画一 选择排序 选择排序的方法包含:简单选择排序.树形选择排序.堆选择排序等.我们主要讲一下最简单的选择排序:简单选择排序法. 基本思想:每一趟 (例如第 i趟,i = 0, 1, -, ...

  5. 数据结构之内部排序--希尔排序

    概要 -IDE:Pycharm -Python版本:python3.x -算法分类:内部排序->插入类排序->希尔排序 算法思想 希尔排序又称缩小增量排序法,是一种基于插入思想的排序方法. ...

  6. 《数据结构》--内部排序算法比较

    题目 各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间.试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受. 基本要求: (1) 从以下常用的内部排 ...

  7. 数据结构之内部排序二

    上一节我们讲解三种简单的排序算法,虽然这3种排序算法的排序结果都是稳定的,但是他们的时间复杂度都是O(n^2),所以这三种算法不是最佳的排序方法,今天我们讲几个时间复杂度低于这三种的排序算法. 排序动 ...

  8. 数据结构之内部排序总结

    排序 排序算法小结 若待排序的元素个数较小(小于50),可以直接插入排序或者简单选择排序. 若文件的初始状态已按关键基本有序,则选用直接插入或冒泡排序 若排序元素较大,应该采用时间复杂度为O(nlog ...

  9. C - 数据结构实验之排序三:bucket sort(水题)

    Description 根据人口普查结果,知道目前淄博市大约500万人口,你的任务是帮助人口普查办公室按年龄递增的顺序输出每个年龄有多少人,其中不满1周岁的按0岁计算,1到2周岁的按1岁计算,依次类推 ...

最新文章

  1. springboot多数据源动态切换和自定义mybatis分页插件
  2. 创建Maven项目时,GroupId和Artifact Id填写
  3. 数论--中国剩余定理模板
  4. maven的三种packaging方式
  5. java8自定义收集器_使用自定义收集器进行Java 8分组?
  6. 如何将word表结构转换为excel表格,最终转换为PowerDesigner格式
  7. base64转file图片上传
  8. Java线程池如何体现自己的用途
  9. 如何从包含代码库的.repo目录恢复出代码
  10. python加权求和_python求加权平均值的实例(附纯python写法)
  11. Unity【Bounds Vector3 Cross】- 如何判断一个物体是否在一个凸边体三维区域内
  12. Latex特殊符号、公式、颜色整合
  13. OpenGL实验2.3 三维模型的平移、缩放和旋转
  14. .invokeRequired属性和 invoke()方法
  15. 住建部《城市信息模型(CIM)基础平台技术标准》正式发布,6月1日起实施
  16. 【MySQL】 # 优化你的SQL语句
  17. Apache HTTP Servcer-Apache服务器下载与Windows系统下安装
  18. flash遍历子元件_Flash编程-详解循环语句
  19. 数据结构-链表(判断链表是否有环)
  20. 由印度登月卫星失败可知,美国登月全部成功必然是造假

热门文章

  1. 鸿蒙JSFA 使用 WebView
  2. django得到Model的全部字段名(field)
  3. pandas series 判断是否包含某个值
  4. mysql迁移、备份数据表,导出表数据与结构
  5. app服务器不运行了,springmvc app URL在本地运行,但不在服务器上运行
  6. python入门教程第三讲_第三讲 使用Template
  7. keil c语言 位域,联合体位域在keil c遇到的问题怎样解决?
  8. java中factory_Java后台面试--Spring中FactoryBean与BeanFactory的使用及区别
  9. OpenStack运维(二):OpenStack计算节点的故障和维护
  10. 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-02 单表查询