文章目录

  • 一、归并排序原理
  • 二、性能分析
  • 三、代码实现
    • 1.原理
    • 2.main函数部分验证
  • 四、如何优化
  • 五、应用场景
  • 总结

归并排序

英文:MergeSort


一、归并排序原理

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。


二、性能分析

时间复杂度:O( n * log(n) )

空间复杂度:O(n)

稳定性:稳定

三、代码实现

1.原理

代码如下(示例):

//归并排序public static void mergeSort(int[] arr){//创建一个新的方法辅助递归,新方法中多了两个参数//表示是针对当前数组中的哪个部分进行排序//前闭后开区间_mergeSort(arr, 0, arr.length);}// [left, right) 前闭后开区间// right - left 为区间中的元素个数public static void _mergeSort(int[] arr, int left, int right){if(right - left <= 1){//如果当前待排序的区间里只有一个元素,或者没有元素//就直接返回,不需要任何排序动作return;}//先把当前 [left, right) 区间一分为二int mid = (left + right) / 2;//分成了两个区间//[left, mid)  [mid, right)//当左侧区间的  _mergeSort 执行完毕后,//就认为 [left, mid) 就已经是有序区间了_mergeSort(arr, left, mid);//当右侧区间的  _mergeSort 执行完毕后,//就认为 [mid, right) 就已经是有序区间了_mergeSort(arr, mid, right);//接下来把左右两个有序数组,合并到一起!merge(arr, left, mid, right);}// merge 方法本身功能是把两个有序数组合并成一个有序数组。// 待合并的两个数组就分别是:// [left, mid)// [mid, right)public static void merge(int[] arr, int left, int mid, int right){//创建一个临时的数组,用来存放合并结果//我们是希望这个数组能存下合并后的结果  right - leftint[] tmp = new int[right - left];//当前要把新的数组元素放到 tmp 数组的哪个下标上int tmpSize = 0;int l = left;int r = mid;while (l < mid && r < right){//归并排序是稳定排序!!!//此处的条件不要写作 arr[l] < arr[r]if(arr[l] <= arr[r]){//arr[l]比较小,就把这个元素先插入到 tmp 数组末尾tmp[tmpSize] = arr[l];tmpSize++;l++;}else{//arr[r] 比较小,就把这个数组插入到 tmp 数组末尾tmp[tmpSize] = arr[r];tmpSize++;r++;}}//当其中一个数组遍历完了之后,就把另外一个数组的剩余部分都拷贝到 临时空间tmpwhile (l < mid){//剩下的都是左半边数组tmp[tmpSize] = arr[l];tmpSize++;l++;}while (r < right){//剩下的是右半边数组tmp[tmpSize] = arr[r];tmpSize++;r++;}//最后一步,再把临时空间的内容都拷贝回参数数组//需要把 tmp 中的内容拷贝回 arr 的 [left, right) 这一段空间里// [left, right) 这个空间很可能不是从 0 开始的for(int i = 0; i < tmp.length; i++){arr[left + i] = tmp[i];}}

2.main函数部分验证

代码如下(示例):

public static void main(String[] args) {int[] arr = {9,5,2,7,3,6,8};mergeSort(arr);System.out.println(Arrays.toString(arr));}

四、如何优化

在排序过程中重复利用两个数组,减少元素的复制过程

五、应用场景

外部排序:排序过程需要在磁盘等外部存储进行的排序
前提:内存中无法把所有数据全部放下,所以需要外部排序,而归并排序是最常用的外部排序   (内存只有 1G,需要排序的数据有 100G)

1. 先把文件切分成 200 份,每个 512 M
    2. 分别对 512 M 排序,因为内存已经可以放的下,所以任意排序方式都可以
    3. 进行 200 路归并,同时对 200 份有序文件做归并过程,最终结果就有序了


总结

以上就是今天要讲的内容,本文介绍了归并排序的使用,欢迎评论区留言,我们共同探讨问题!

归并排序(Java)相关推荐

  1. 堆排序和归并排序 java代码实现

    文章目录 堆排序 java代码实现 单元测试 归并排序 java代码实现 单元测试 堆排序 java代码实现 package csdn.dreamzuora.sort;import java.util ...

  2. 排序算法之归并排序(JAVA)

    归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并 ...

  3. 归并排序Java实现

    归并排序Java实现 public class MergeSort {public static void sort(int[] a,int left, int right){if(left > ...

  4. 归并排序--Java

    归并排序: 排序原理: 1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,知道拆分后的每个子组的元素个数是1为止. 2.将相邻的两个子组进行合并成一个有序的大组 3.不断重复步骤2 ...

  5. 归并排序——java

    import java.util.Arrays; public class Cao46 { /** * @归并排序 * * 三个指针:两个指针最初位置分别为两个已经排序序列的起始位置,第三个指针两个序 ...

  6. 归并排序Java详解+例题

    归并排序->分治 归并排序 归并排序->分治 背景 归并原理与过程 原理: 过程 图形展示 模板代码 模板讲解 归并例子 完整java代码 背景 归并排序是十大排序之一 十大排序: 归并原 ...

  7. 归并排序 java实现_归并排序的java实现

    归并排序的优点不说了. 做归并排序之前,我先试着将两个有序数组进行排序,合并成一个有序数组. 思路:定义好两个有序数组,理解的时候我先思考了数组只有一个数组的排序,然后是两个元素的数组的排序,思路就有 ...

  8. 归并排序 java 迭代_经典排序算法之归并排序(示例代码)

    归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为 (大O符号).1945年由约翰·冯·诺伊曼首次提出.该算法是采用分治法(Divide an ...

  9. 归并排序的java语言_归并排序 java语言

    /* * 归并排序算法 */ public class MergeSort { final static int MAX=0x7FFFFFFF; public static void main(Str ...

  10. 912. 排序数组——归并排序Java时间复杂度空间复杂度稳定性分析

    目录 1.题目 2.思路 归并排序--nlogn 思想--递归 代码 时间复杂度--O(nlogn) 空间复杂度--O(n) 稳定性--稳定 3.结果 1.题目 2.思路 这个题可以作为练习手写各种排 ...

最新文章

  1. 想让关系更好就不要怕麻烦
  2. CAD绘图控件VectorDraw web library (javascript)更新至v7.7014.1.0丨75折优惠
  3. c语言自定义函数程序设计,ch3自定义函数设计 C语言 《解析C程序设计》.ppt
  4. k8s部署jar包_学习K8S之路.6--- 在K8S中部署Jenkins,并使用Jenkins打包jar包
  5. php 怎么获取meta标签,php – 通过jQuery获取META描述
  6. [Android学习系列14]聊天通信的实现
  7. 一款非常好用的音乐标签及管理工具:Yate for Mac
  8. python房子代码_基于python的链家小区房价爬取——仅需60行代码!
  9. 【bzoj 4455】小星星(树型DP+容斥原理+dfs建树和计算的2种方式)
  10. 孔板流量计计算公式_带你全面了解各种流量计!
  11. (一)区块链的共识算法:整体介绍 及 分叉 的通俗讲解
  12. 查看服务器虚拟机版本,查看虚拟机版本命令
  13. 计算机驱动打不开,驱动人生打不开怎么办
  14. New Year Snowmen(贪心)
  15. 工控液晶屏开机白屏怎么回事,开机白屏解决方法?
  16. ckeditor5 全屏功能
  17. 宏病毒的研究与实例分析02——复合文档格式分析
  18. 社区服务器目录迁移实际开发运用
  19. 怎么看自己的maven本地仓库在那里
  20. 拍手数据集_我如何(重新)建立中等拍手效果-以及从实验中得到的结果。

热门文章

  1. VRay4.2 for 3dsMax2013-2020
  2. 【最全】《数据库原理及应用》知识点整理+习题
  3. Android仿微信源码下载
  4. C99标准的新特性介绍
  5. EDI 公开课:EDI 系统集成之数据库方案
  6. 一款简单实用的iOS分享框架(支持三方登陆)
  7. 二级python有必要买书吗_清华大学出版社-图书详情-《二级Python编程指南》
  8. [Http权威指南]1.Http概况
  9. 广东工业大学通信原理复习笔记第六章数字信号的基带传输(思维导图)含链接和习题
  10. Drool学习记录(二) Kie Session、Truth maintenance