七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码)

这篇具有很好参考价值的文章主要介绍了七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、排序的概念

排序的概念

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

排序的稳定性

七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码),Java实现的算法,排序算法,java,算法
上述待排序的数中,有两个5。 将前面的5标记一个a, 将后面的5标记一个b。

通过算法进行排序后,这一组数就有序了, 但是要看两个相同的5的位置是否有改变。
5a仍在5b前面,那么这个排序算法就是稳定的
5a跑到了5b后面,那么这个排序算法就是不稳定的

一个稳定的排序算法可以做到不稳定,
不稳定的排序算法一定做不到稳定。


至于为什么要讨论这个稳定性, 是为了以后应用到实际场景上。 比如,一场数学考试, 假设a用了30分钟做完了,并得了满分。
假设b用了一个小时做完了,并得了满分。 此时a与b都是得了满分,但是用的时间不一样,所以两个人的排名又会有所不同。


七大排序算法

七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码),Java实现的算法,排序算法,java,算法


二、归并排序

核心思想

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

图解

有一组待排序数列,我们进行升序排序。
七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码),Java实现的算法,排序算法,java,算法
七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码),Java实现的算法,排序算法,java,算法
七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码),Java实现的算法,排序算法,java,算法
拆分过程:将一个数组逐层拆分成多个子序列,直到每个子序列只剩一个数据,那么就认为这个子序列是有序的。
合并过程:再逐一将这些子序列进行有序合并,最后得到的序列就是有序的。


代码实现

代码实现

public class MergeSort {
    /**
     * 归并排序
     * 时间复杂度:O(n*logn)
     * 空间复杂度:O(n)
     * 稳定性:稳定
     * @param array
     */

    //递归实现的归并排序
    public static void mergeSort(int[] array) {
        mergeSortFunc(array,0, array.length-1);
    }
    private static void mergeSortFunc(int[] array,int left,int right) {
        if(left >= right) {
            return;
        }
        int mid = (left+right)/2;
        mergeSortFunc(array,left,mid);
        mergeSortFunc(array,mid+1,right);
        merge(array,left,right,mid);
    }
    // 合并方法
    private static void merge(int[] array,int start,int end,int mid) {
        // 创建一个新数组
        int[] ary = new int[end-start+1];
        // 左边有序数组的起始下标
        int left = start;
        // 右边有序数组的起始下标
        int right = mid+1;
        for (int i = 0; i < end-start+1; i++) {
            // 如果左边有序数组已经全部有序的存入了新数组,
            // 那就证明剩下右边有序数组的数已经有序了,不用比较直接存入
            if(left > mid) {
                ary[i] = array[right++];
            // 如果右边有序数组已经全部有序的存入了新数组,
            // 那就证明剩下左边有序数组的数已经有序了,不用比较直接存入    
            }else if (right > end) {
                ary[i] = array[left++];
            // 哪个小哪个先存进新数组    
            } else if(array[left] > array[right]) {
                ary[i] = array[right++];
            }else {
                ary[i] = array[left++];
            }
        }
        // 将新数组按位置存入需要排序的数组
        for (int i = start; i < end+1; i++) {
            array[i] = ary[i - start];
        }
    }

    


三、性能分析

归并排序总结
归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。
时间复杂度:O(n*logn)
空间复杂度:O(n)
稳定性:稳定


四、七大排序算法性能对比

七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码),Java实现的算法,排序算法,java,算法

想学哪个点哪个
归并排序讲解
快速排序讲解
直接插入排序讲解
希尔排序讲解
直接选择排序讲解
堆排序讲解
冒泡排序讲解文章来源地址https://www.toymoban.com/news/detail-558615.html

到了这里,关于七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【算法与数据结构】归并排序的代码实现(详细图解)以及master公式的讲解

    【算法与数据结构】归并排序的代码实现(详细图解)以及master公式的讲解

    目录 1、归并排序  1.1、算法描述  1.2、图解说明 2、代码实现  3、master公式 3.1、公式以及结论 3.2、适用于某些特殊的递归 3.3、计算归并排序的时间复杂度 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用 递归 或者说是 分治法 (Divide and Conquer)的一个非

    2024年02月08日
    浏览(15)
  • 【JAVA】七大排序算法(图解)

    【JAVA】七大排序算法(图解)

    稳定性: 待排序的序列中若存在值相同的元素,经过排序之后,相等元素的先后顺序不发生改变,称为排序的稳定性。 思维导图: (排序名称后面蓝色字体为 时间复杂度和稳定性 ) 核心思路 每次从无序区间中选择第一个元素,插入到有序区间的合适位置,直到整个数组有

    2024年02月12日
    浏览(9)
  • 直接选择排序:最通俗易懂的排序算法

    直接选择排序:最通俗易懂的排序算法

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 : 《数据结构算法》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 直接选择选择排序也是八大排序之一的排序算法,虽然实际应用上其实并不会选择它来进行排序,但它的思想和价值还是十分值得我的去学习的! 选择排序的思想

    2024年02月03日
    浏览(8)
  • 排序算法进阶——归并排序【详细图解,递归和非递归】

    排序算法进阶——归并排序【详细图解,递归和非递归】

    在了解归并排序之前让我们先了解一下归并这一算法吧! 归并算法一般应用于合并两个已经有序的序列,使合并后的序列也有序,是一个时间复杂度为O(N)的算法,不过一般要借助两个要排序的序列的元素个数个额外的空间。 一一一一一一一一一一一一一一一一一一一一一

    2024年01月24日
    浏览(7)
  • 用通俗易懂的方式讲解:CatBoost 算法原理及案例

    用通俗易懂的方式讲解:CatBoost 算法原理及案例

    前面已讲了7节,为方便大家学习,我总结在一起,无论是日常实践还是面试使用,都非常方便,喜欢记得收藏 用通俗易懂的方式讲解:逻辑回归模型及案例(Python 代码) 用通俗易懂的方式讲解:决策树模型及案例(Python 代码) 用通俗易懂的方式讲解: 随机森林及案例(

    2024年04月12日
    浏览(16)
  • KMP算法——通俗易懂讲好KMP算法:实例图解分析+详细代码注解 --》你的所有疑惑在本文都能得到解答

    KMP算法——通俗易懂讲好KMP算法:实例图解分析+详细代码注解 --》你的所有疑惑在本文都能得到解答

    KMP 是一个 解决模式串在文本串是否出现过 ,如果出现过,最早出现的位置的经典算法。 Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP 算法”,常用于 在一个文本串 S 内查找一个模式串 P 的出现位置 ,这个算法由 Donald Knuth 、 Vaughan Pratt 、 James H. Morris 三人于 1977 年联合发表

    2024年02月07日
    浏览(8)
  • 排序算法-归并排序详细讲解(MergeSort)

    排序算法-归并排序详细讲解(MergeSort)

    归并,指合并,合在一起。归并排序(Merge Sort)是建立在归并操作上的一种排序算法。其主要思想是分而治之。 若将两个有序集合并成一个有序表,称为2-路归并,与之对应的还有多路归并。 对于排序最好的情况来讲,就是只有两个元素,这时候比较大小就很简单,但是还

    2024年02月08日
    浏览(10)
  • 算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

    算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

    (一)题目 问题描述 给定一个由 n n n 行数字组成的数字三角形,如图所示。 试设计一个算法,计算从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 算法设计 对于给定的由 n n n 行数字组成的数字三角形,计算从该三角形的顶至底的路径经过的数字和的最大值

    2023年04月10日
    浏览(13)
  • 算法分析与设计-会场安排问题(贪心)(通俗易懂,附源码和图解,含贪心选择性质和最优子结构性质的证明)(c++)

    算法分析与设计-会场安排问题(贪心)(通俗易懂,附源码和图解,含贪心选择性质和最优子结构性质的证明)(c++)

    (一)题目 问题描述 假设在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点有着不同颜色的最小着色数,相当于

    2024年02月07日
    浏览(48)
  • 【数据结构】 七大排序详解(贰)——冒泡排序、快速排序、归并排序

    【数据结构】 七大排序详解(贰)——冒泡排序、快速排序、归并排序

    ==冒泡排序(Bubble Sort)==也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包