二路归并排序

二路归并排序是采用的分而治之的思想。将一个待排序的序列分成两个序列,分别对这两个序列排序。而对于这两个序列排序的方式也是还之前一样,将这两个序列分别分成两个序列分别排序。一直这样分割下去,知道序列中没有元素或者已有一个元素为止。因为没有元素的序列和只有一个元素的序列定是一个有序的序列,所以相当于将这个序列排序完毕,向上返回。返回的过程中做的最重要的一件事就是将两个有序的序列合并成一个有序的序列。

所以归并排序最重要的两步是分割和合并。

例如:序列{50, 90, 30, 70, 40, 80, 60, 20}。这个序列进行二路归并排序的过程如下图所示:

int MergeSort(datatype *array, int low, int high)
{int i, j, k;int mid;int *temp;if(array == NULL) {return -1;}if(low >= high) {return -1;}
//辅助数组存两个数组有序之后合并成为的一个有序的数组temp = (int *)malloc(sizeof(int)*(high-low+1));if(temp == NULL) {return -1;}mid = (low + high) / 2;//递归调用归并排序去是分割成的两个序列有序MergeSort(array, low, mid);MergeSort(array, mid+1, high);//下面的程序是将两个有序的序列合并为一个有序的序列i = low;j = mid+1;k = 0;
//i指向第一个数组当前的比较值,j指向第二个数组的比较值while(i <= mid && j <=high) {
//比较i指向的值和j指向的值,将比较小的赋值给tempif(array[i] < array[j]) {temp[k++] = array[i++];} else {temp[k++] = array[j++];}}//当i依旧小于mid时,相当于第一个序列还有剩余的一个或多个数据
//这些数肯定都是大于第二个序列的所有的数的。将这些数全部依次赋值给tempwhile(i <= mid) {temp[k++] = array[i++];}//当j依旧小于high时,相当于第一个序列还有剩余的一个或多个数据
//这些数肯定都是大于第一个序列的所有的数的。将这些数全部依次赋值给tempwhile(j <= high) {temp[k++] = array[j++];}//将temp中所保存的整个有序的序列赋值到原先序列的对应位置中for(i = 0; i <= high-low; i++) {array[low+i] = temp[i];}return 0;
}

排序算法之二路归并排序相关推荐

  1. 排序算法之——二路归并排序

    排序算法之--二路归并排序 二路归并排序的思想: 一次排序过程,将已经各自有序的两个段的数据合并一个段,并且合并后依旧有序 开始,我们认为单个数据是有序的,一个数据就是一个段,一次排序之后,两个数据就 ...

  2. 图解排序算法(四)之归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide) ...

  3. js排序算法详解-归并排序

    js系列教程5-数据结构和算法全解 js排序算法详解-归并排序 归并排序其实可以类比二分法,二分法其实就是二等分的意思,简而言之就是不断和新序列的中间值进行比较.归并排序似乎有异曲同工之妙,什么意思呢 ...

  4. java 排序算法总结,Java排序算法总结之归并排序

    本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...

  5. 【Java】排序算法 之 【归并排序】 总结

    目录 1.合并两个有序数组函数 2. 归并排序 3. 非递归实现归并排序 1.合并两个有序数组函数 在学习归并排序之前,我们需要掌握合并两个有序数组为一个有序数组的函数是如何实现的 /*** 合并两个 ...

  6. 排序算法总结之归并排序

    一,归并排序介绍 归并排序是一个典型的基于分治的递归算法.它不断地将原数组分成大小相等的两个子数组(可能相差1),最终当划分的子数组大小为1时(下面代码第17行left小于right不成立时) ,将划 ...

  7. PHP实现归治算法,PHP排序算法系列之归并排序详解

    归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序 ...

  8. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 1 private void merge_sort(int[] array, i ...

  9. 排序算法系列:归并排序算法

    概述 上一篇我们说了一个非常简单的排序算法--选择排序.其复杂程序完全是冒泡级的,甚至比冒泡还要简单.今天要说的是一个相对比较复杂的排序算法--归并排序.复杂的原因不仅在于归并排序分成了两个部分进行解 ...

  10. 排序算法研究之归并排序(Merge sort)

    前面几个小节,我们分别介绍了冒泡排序,插入排序,直接快速排序 ,选择排序 , 希尔排序, 堆排序本节,我们介绍基于归并操作的归并排序. 1.算法思想 归并排序是建立在归并操作上的一种有效的排序算法.该 ...

最新文章

  1. mysql sql 检测磁盘_MySQL 找到临时表用到磁盘的SQL
  2. 安卓怎么显示res文件夹中的html_android中自定义WebView显示网页或本地html文件 | 学步园...
  3. python疑问5:位置参数,默认参数,可变参数,关键字参数,命名关键字参数区别...
  4. C++离航篇——内存的申请释放
  5. Numpy出现TypeError: integer argument expected, got float的分析与解决
  6. 华为主题包hwt下载_华为主题太丑?修改方式它来了
  7. RocketMQ知识点整理
  8. HTML基础——HTML
  9. “钱妈妈”平台犯罪嫌疑人被抓捕 涉嫌非法吸收公众存款
  10. 《软件工程》实训报告
  11. 台式机计算机在哪里看,IT教程:台式电脑主板型号在哪里看
  12. 《Android编程权威指南(第三版)》第五章挑战练习Demo
  13. 我知道很多主播因为以前因为公会的名声不太好,或者不想签约被束缚等原因
  14. 砍价两种种算法(转载)
  15. 海康威视校招C++岗面经
  16. python批量删除文件前缀名_Python3-去除目录中相同的文件名前缀
  17. eclipse不进入断点_eclipse断点不起作用怎么办?
  18. Kelvin's Oracle on centOS6.5
  19. 电子电路仿真设计与制版软件综述 - PCB, OrCAD, PADs
  20. 实现:您必须使用微信内置浏览器访问本页面! 的功能

热门文章

  1. 语音数据标注工具与平台
  2. uniapp开发原生android插件,获取浏览器cookie
  3. 用Java开发手机Andriod系统Apk软件
  4. mysql 数据库并发限制_数据库的并发控制 - zhangjianyf的个人页面 - OSCHINA - 中文开源技术交流社区...
  5. STM32WL开发之LORA产品选型
  6. 【2022年的STM32】 02-STM32总览
  7. Android 360分包,如何安装分包app安装包
  8. 计算机系统基础-袁春风老师-mooc-第二章测试习题及解析
  9. centerOS 7.6FTP安装与配置
  10. 家政服务微信小程序开发