文章目录

  • 1、概述
  • 2、测试代码
  • 3、小案例

1、概述

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

归并排序可以分为两部分,一部分用来分解数组(使用递归的方式),一部分用来合并数组


2、测试代码

核心思想:将这个算法分为分(分解)和治(合并)两部分。将我们最初的数组就不断地递归分解:一分二,二分四,四分八…直到我们数组中的元素变成一个一个的。然后在分(分解)完成的时候,再进行一个治(合并),…八个合并为四个,四个合并为两个,两个合并为一个,每次合并完成时,对应的新数组都是按照顺序排列好的,直到合并为一个已经排好序的数组位置。

public class MergetSortTest01 {public static void main(String[] args) {int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};int[] temp = new int[arr.length];//调用我们的分解、合并的方法mergeSort(arr, 0, arr.length - 1, temp);System.out.println(Arrays.toString(arr));}//一:分解+合并的方法public static void mergeSort(int[] arr, int left, int right, int[] temp) {if (left < right) {int mid = (left + right) / 2;//先向左递归进行分解mergeSort(arr, left, mid, temp);//左递归分解完毕后,开始向右递归进行分解mergeSort(arr, mid + 1, right, temp);//当该递归方法执行完一次以后,就开始执行该方法,用于合并分解后的数组merge(arr, left, mid, right, temp);}}//二:合并的方法public static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left;int j = mid + 1;int t = 0;//这里有两个不同数组:第一个为被合并的数组(不同的位置上的数据),第二个为合并后的新数组//1.将我们两个数组的数字进行比较,并且按照一定的顺序放入到我们的新的数组里面while (i <= mid && j <= right) {//2.将我们被合并的数组的i位置上的值和j位置上的值进行比较,谁小就放谁if (arr[i] <= arr[j]) {temp[t] = arr[i];t++;i++;} else {temp[t] = arr[j];t++;j++;}}//3.上面的方式的补充部分//左边的有序序列还有剩余的数字,填充到temp数组中while (i <= mid) {//不断的将元数组的index和临时数组的index后移,用于填充数值temp[t] = arr[i];t++;i++;}//4.右边的有序序列还有剩余的数字,填充到temp数组中while (j <= right) {//不断的将元数组的index和临时数组的index后移,用于填充数值temp[t] = arr[j];t++;j++;}//5.将(left~right的)temp数组的元素拷贝到arr中t = 0;int tempLeft = left;while (tempLeft <= right) {arr[tempLeft] = temp[t];t += 1;tempLeft += 1;}}
}

3、小案例

利用我们以有的条件,进行一个小案例的测试:计算将数组长度为80000的乱序数组排序所花费的时间

public class MergetSortTest02 {public static void main(String[] args) {int[] arr = new int[80000];for (int i = 0; i < 80000; i++) {arr[i] = (int) (Math.random()*80000);}long start = System.currentTimeMillis();int[] temp = new int[arr.length];mergeSort(arr, 0, arr.length - 1, temp);long end= System.currentTimeMillis();System.out.println("归并排序的时间为:"+(end-start));}//一:分解+合并的方法public static void mergeSort(int[] arr, int left, int right, int[] temp) {if (left < right) {int mid = (left + right) / 2;//先向左递归进行分解mergeSort(arr, left, mid, temp);//左递归分解完毕后,开始向右递归进行分解mergeSort(arr, mid + 1, right, temp);//合并merge(arr, left, mid, right, temp);}}//二:合并的方法public static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left;int j = mid + 1;int t = 0;while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[t] = arr[i];t++;i++;} else {temp[t] = arr[j];t++;j++;}}//补充没有赋值到的数据while (i <= mid) {temp[t] = arr[i];t++;i++;}while (j <= right) {temp[t] = arr[j];t++;j++;}//完成数组值的交换t = 0;int tempLeft = left;while (tempLeft <= right) {arr[tempLeft] = temp[t];t += 1;tempLeft += 1;}}
}

我们的归并排序,递归的次数是指数形式增加的。所以该排序方式,更适合于数据较多的时候使用

常见排序算法之归并排序相关推荐

  1. 常见排序算法之归并排序——归并排序

    哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的归并排序,博主在这里先分享归并排序的递归算法,包您一看就会,快来试试吧~ ​ 目录 一.归并排序 1.1 基本思想 1.2 算法思想 1. ...

  2. 常见排序算法:归并排序

    为什么80%的码农都做不了架构师?>>>    前面的三种排序算法(冒泡排序,选择排序,插入排序)在平均情况下均为O(n^2)复杂度,在处理较大数据的时候比较吃力.现在来说说相对快速 ...

  3. 常见排序算法原理及实现——第二部分(归并排序、快速排序、堆排序)

    引言 排序算法第一部分,我们聊了冒泡排序.插入排序.选择排序这三种排序算法,它们的时间复杂度比较高,都是 O(n2),适合小规模数据的排序.今天,我们来看三种时间复杂度为 O(nlogn) 的排序算法 ...

  4. android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些

    学Java能拿高薪吗?Java中常见排序算法有哪些?作为老牌编程语言,Java拥有广阔的市场占有率,几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java.为了加入到Java这一高薪行业,很 ...

  5. python实现常见排序算法

    python实现常见排序算法 快速排序 思想:取出第一个元素把它放到序列的中间某一个正确位置,以它进行分割成左边和右边,再分别对左边和右边进行取元素分割(递归) 递归实现 def quicksort( ...

  6. php 面试靠快速排序,搞定PHP面试 - 常见排序算法及PHP实现

    常见排序算法及PHP实现全文代码使用PHP7.2语法编写 0. 五种基础排序算法对比 1. 冒泡排序(Bubble Sort) 冒泡排序 是一种交换排序,它的基本思想是:对待排序记录从后往前(逆序)进 ...

  7. python常见排序算法解析

    python--常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分 ...

  8. C/C++排序算法(5)归并排序

    常见排序算法总结(5)归并排序 一篇文章,带你搞懂 归并排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! 温馨提示:代码在文章末尾 1.基本思想 归并排序(MERGE ...

  9. 常见排序算法的原理与实现(js)

    常见排序算法通常需要通过比较来确定次序(比较类排序):由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 各类排序算法的特点: 术语解释: 时间复杂度:对排序数据的总的操作次数 ...

  10. 十种常见排序算法欢聚一堂

    文章目录 1.常见排序算法分类 2.非线性时间比较类排序 2.1 交换类排序 2.1.1 冒泡排序 2.1.2 快速排序 2.2 插入类排序 2.2.1 直接插入排序 2.2.2 Shell 排序 2 ...

最新文章

  1. python music21将音符转为mid格式音乐
  2. 网络营销外包浅析当前行业竞争压力之下网络营销外包公司如何应对?
  3. android分享到指定应用,Android调用系统分享,指定某些应用来分享
  4. 郎溪 溪流_到无限(溪流)和超越!
  5. weblogic忘记console密码
  6. python如何查看源码_查看“Python-2020-fall”的源代码
  7. 两套苹果CMS付费模板:MXone自适应模板+仿电影先生2.0
  8. C# 自定义类型转换
  9. 百度关键词点击ios_百度推广关键词点击价格高,如何处理?
  10. 机器学习回归问题解答
  11. ajax请求的五个媒体查询,七个高度有效的媒体查询技巧
  12. iOS 关于本地持久化存储的探讨
  13. 编辑按钮 php,自动编辑按钮-海豚PHP1.0.6完全开发手册-基于ThinkPHP5.0.10的快速开发框架...
  14. 使用XMLHttpRequest
  15. 冰雪传奇刷怪计时器_冰雪传奇BOSS计时器
  16. 怎么做淘宝客赚钱,淘客经验分享。
  17. HTML5 CSS3做的一个静态的苹果官网首页
  18. 用MATLAB求一阶微分方程(组)数值解
  19. github电脑壁纸_GitHub - jadepeng/bing-wallpaper: Bing每日壁纸,自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事...
  20. html制作网易云音乐登录系统,JavaScript实现[网易云音乐Web站登录窗口]拖拽功能...

热门文章

  1. Luogu4113 [HEOI2012]采花
  2. Win10下安装并配置Python环境变量以及pip的安装、更新与使用
  3. 网络基础知识(黑马教程笔记)-5-路由
  4. html行为样式动作是啥,什么是结构、样式、行为分离?
  5. 2008 php mysql_windows 2008配置Nginx+PHP+Mysql
  6. leetcode·双指针
  7. 3种常用的Redis缓存读写策略
  8. 洛谷 P1017 进制转换
  9. 如何不做老板手中一次性筷子?
  10. 按月分表(create table)