一、算法思想

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用,指的是将两个已经排序的序列合并成一个序列的操作。其归并思想如下:

1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
2)设定两个指针,最初位置分别为两个已经排序序列的起始位置;
3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
4)重复步骤3直到某一指针达到序列尾;
5)将另一序列剩下的所有元素直接复制到合并序列尾;

在使用归并排序算法的时候,算法如下:

1)将序列切分,直至切分到序列是有序的(这里通过将序列切分成单个元素达到目的);

2)将序列块两两归并成较大的序列块;

3)将较大的序列块再度归并,不断继续,直至归并形成和原始序列同样大小的序列;

二、算法示意图

如图所示,首先第一行表示待排序的序列,第一步就是将序列元素切割为一个个的独立元素(表示有序序列),接着将相邻的两个元素按照归并思想合并成第二行,同样颜色的元素属于一组,接着再次归并,形成第三行的样子。接着将两组归并,就可以形成最后一行已经排好序的样子。

三、Java代码

 1 public class MergeSort extends Sort {
 2     public static void sort(int[] array) {
 3         int[] tempArray = new int[array.length];
 4         mergeSort(array, tempArray, 0, array.length - 1);
 5         printArray(array);
 6     }
 7
 8     private static void mergeSort(int[] array, int[] tempArray, int left, int right ) {
 9         if ( left < right ) {
10             int center = ( left + right ) / 2;
11             mergeSort(array, tempArray, left, center);
12             mergeSort(array, tempArray, center + 1, right);
13             merge(array, tempArray, left, center + 1, right);
14         }
15     }
16
17     private static void merge( int[] array, int[] tempArray, int left, int right, int end) {
18         int tempLeft = left;
19         int tempRight = right;
20         int position = left;
21
22         while(tempLeft < right && tempRight <= end){//两个队列都没到头
23             if(array[tempLeft] < array[tempRight])
24                 tempArray[position++] = array[tempLeft++];
25             else
26                 tempArray[position++] = array[tempRight++];
27         }
28
29         while(tempLeft < right){
30             tempArray[position++] = array[tempLeft++];
31         }
32
33         while(tempRight <= end){
34             tempArray[position++] = array[tempRight++];
35         }
36
37         for(int index = left; index <= end; index++){//复制回去
38             array[index] = tempArray[index];
39         }
40     }
41 }

算法的精华在于函数mergeSort,这是一个递归算法,从第9行可以看出来,数组首先被切成单个单个的元素,然后再归并。第11~13行首先对左半部分进行归并排序,然后对右半部分进行归并排序,最后整体归并。

四、算法复杂度

这里的分析和快速排序一致,同时,由于它是均分,不会出现和快速排序那样分裂开来的序列不均匀导致的性能差异。我们由函数mergeSort可知,T(n)=O(nlogn)。

由上面的实现代码可知,其空间复杂度为O(n)。我们只需要一个临时数组在合并的时候保存数据即可。

转载于:https://www.cnblogs.com/lqminn/p/3650223.html

【DS】排序算法之归并排序(Merge Sort)相关推荐

  1. 归并有效排序算法matlab,科学网—[用MATLAB写算法]之排序算法2)归并排序merge sort - 徐勇刚的博文...

    归并排序(merge sort)是一种利用分治策略(divide and conquer)进行排序的算法,算法复杂度为 $\Theta (nlog_{2}n)$ . filename: merge_s ...

  2. python实现基本算法之归并排序(Merge sort)

    基本算法之归并排序(Merge sort) 基本算法-04.归并排序(Merge sort)算法 .往期请看选择排序,插入排序,归并排序,快速排序等等都发布的!欢迎大家批评指正! 文章目录 基本算法之 ...

  3. 排序算法之 Inplace Merge Sort

    Non-recursive Merge Sort (cpp_merge_sort.cc) ======================================================= ...

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

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

  5. python选择排序算法图解_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  6. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 ...

  7. python 归并排序算法_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  8. 归并python_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  9. C语言以递归实现归并排序Merge Sort算法(附完整源码)

    以递归实现归并排序Merge Sort 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main ...

  10. C语言归并排序Merge Sort算法(附完整源码)

    归并排序Merge Sort 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) #include ...

最新文章

  1. python二十三:装饰器 ?
  2. 科大星云诗社动态20210328
  3. linux下的系统调用函数到内核函数的追踪
  4. Python教程:一篇文件教你py文件打包成exe
  5. Codeforces Global Round 14 E. Phoenix and Computers 思维 + dp
  6. 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景
  7. mysql连接不上远程数据库_Mysql 连接不上远程数据库,求助
  8. php 数字或者字符串补全
  9. VirtualBox虚拟机硬盘容量扩容
  10. linux定时删除文件,Linux下定时删除文件
  11. oVirt管理端高可用模式搭建(hosted-engine)
  12. http,https
  13. 电机专题:控制电机介绍
  14. C++小工修炼手册XXVII (二叉搜索树的简单实现以及原理解释)
  15. C语言宏定义函数中的“_##”的意思
  16. 如何制作一个漂亮的生日祝福网页
  17. 微信公帐号配置小程序菜单
  18. 使用jPlayer实现带广告功能和试听试看功能的MP4/MP3播放
  19. 企业邮箱必须注意的三大安全问题
  20. hybrid几种模式

热门文章

  1. 在Mac中安装opencv-python
  2. Redis相比memcached
  3. linux命令date
  4. STM8控制4位LED数码管显示数字
  5. C#之windows桌面软件第二课:向单片机发信息的串口工具
  6. char s[] 和 char *s 的区别
  7. mybaits二十三:二级缓存
  8. java:栈空间,堆空间,方法区
  9. python实训第七天
  10. 转-D3D中的四元数