首页 > 其他分享 >宝藏速成秘籍(6)归并排序法

宝藏速成秘籍(6)归并排序法

时间:2024-06-09 14:30:34浏览次数:21  
标签:10 归并 27 秘籍 43 速成 82 序列 排序

一、前言

1.1、概念

       归并排序(Merge Sort)是一种基于分治思想的排序算法。它将数组分成两个子数组,分别对这两个子数组进行排序,然后再将它们合并成一个有序的数组。归并排序是一种经典的分治算法,它的核心思想是将待排序的序列逐步划分成更小的子序列,然后将这些子序列两两合并成更大的有序子序列,最终得到一个完全有序的序列。

 1.2、排序步骤   

1.分割(Divide):将数组递归地分成两个子数组,直到每个子数组只有一个元素。
2.合并(Merge):将两个有序的子数组合并成一个有序的数组。

二、方法分析 

  1. 划分: 将待排序的序列不断递归地划分成更小的子序列,直到每个子序列只剩下一个元素。

  2. 合并: 将两个有序的子序列合并为一个有序的序列。在合并过程中,创建一个临时数组来存储合并后的结果。比较两个子序列的第一个元素,将较小的元素放入临时数组,并将对应子序列的指针向后移动。重复这个过程,直到其中一个子序列的元素全部合并完毕,然后将另一个子序列的剩余元素依次放入临时数组。

  3. 递归: 通过递归地调用自身,将这些子序列合并成越来越大的有序子序列,直到最终合并成一个完全有序的序列。

三、举例说明  

假设我们有一个数组 [38, 27, 43, 3, 9, 82, 10]:

1.分割:
   - [38, 27, 43, 3, 9, 82, 10] 分成 [38, 27, 43] 和 [3, 9, 82, 10]
   - [38, 27, 43] 分成 [38] 和 [27, 43]
   - [27, 43] 分成 [27] 和 [43]
   - [3, 9, 82, 10] 分成 [3, 9] 和 [82, 10]
   - [3, 9] 分成 [3] 和 [9]
   - [82, 10] 分成 [82] 和 [10]

2.合并:
   - 合并 [27] 和 [43] 得到 [27, 43]
   - 合并 [38] 和 [27, 43] 得到 [27, 38, 43]
   - 合并 [3] 和 [9] 得到 [3, 9]
   - 合并 [82] 和 [10] 得到 [10, 82]
   - 合并 [3, 9] 和 [10, 82] 得到 [3, 9, 10, 82]
   - 最后合并 [27, 38, 43] 和 [3, 9, 10, 82] 得到 [3, 9, 10, 27, 38, 43, 82]

这样,我们就得到了最终排序后的数组。

 四、编码实现  

 下面是用Java实现的归并排序算法:

public class MergeSort {

    public static void mergeSort(int[] arr) {
        if (arr == null || arr.length <= 1) {
            return;
        }

        int[] temp = new int[arr.length];
        mergeSort(arr, 0, arr.length - 1, temp);
    }

    private 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); // 合并两个有序子序列
        }
    }

    private 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++];
            } else {
                temp[t++] = arr[j++];
            }
        }

        while (i <= mid) {
            temp[t++] = arr[i++];
        }

        while (j <= right) {
            temp[t++] = arr[j++];
        }

        t = 0;
        while (left <= right) {
            arr[left++] = temp[t++];
        }
    }

    public static void main(String[] args) {
        int[] arr = { 5, 9, 3, 1, 8, 6, 4, 2, 7 };
        mergeSort(arr);

        System.out.println("排序后的数组:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}
 

 运行结果:

 五、方法评价  

       归并排序的时间复杂度为O(nlogn),其中n是待排序序列的长度。这是因为每次划分序列的过程需要花费O(logn)的时间,而每次合并序列的过程需要花费O(n)的时间。同时,归并排序是稳定的排序算法,即保持相等元素的相对顺序不变。但是,归并排序的空间复杂度为O(n),因为在合并过程中需要使用额外的临时数组。

 结语 

 成功没有捷径

如果有,那一定是上天对坚持不懈人的眷爱

!!!

标签:10,归并,27,秘籍,43,速成,82,序列,排序
From: https://blog.csdn.net/m0_73399576/article/details/139561509

相关文章

  • 数据结构与算法之归并排序,以及它的代码实现与事例
    目录前言定义策略代码实现结果结束语前言今天是坚持写博客的第22天,我们来看看数据结构与算法当中的归并排序。定义首先我们来看看什么是归并排序?归并排序(MergeSort)是一种分治思想的排序算法。它将待排序的数组分成若干个子数组,每个子数组都是有序的,然后再将有序......
  • 8645 归并排序(非递归算法)
    Description用函数实现归并排序(非递归算法),并输出每趟排序的结果输入格式第一行:键盘输入待排序关键的个数n第二行:输入n个待排序关键字,用空格分隔数据输出格式每行输出每趟排序的结果,数据之间用一个空格分隔输入样例105480932671输出样例4508392......
  • Mysql基础进阶速成2
    看着篇文章之前先看我的前一章:MySQL基础进阶速成1函数:每个字段使用一个函数:select+函数(字段名)+from+表名upper:将字符串中的字母大写lower:将字符串中的字符小写max:得到最大值min:得到最小值count:计数avg:平均数length:获取字符串长度........selectupper(name)fro......
  • 2024年网络安全最新60天黑客速成,学完的都进大厂了!
    但现实中,黑客其实并没有那么神秘,也是一群疯狂码代码,头发没剩几根的程序员…那么想成为一名真正的黑客,需要多久呢?不开玩笑,只需60天!下面我们来看看要怎么有效学习:零基础的小伙伴跟着我的这套学习路线,日后跳槽大厂、拿到百万年薪也不是不可能!首先初级阶段需要花2天时间了......
  • 揭秘电商高效运营:一键获取1688店铺商品列表的API秘籍
    1688平台是阿里巴巴集团旗下的B2B电子商务网站,为商家提供了一个庞大的商品交易市场。对于需要自动化获取商品信息的商家和开发者来说,1688提供了API接口服务。数据精确获取:提供店铺商品的详细信息。自动化操作:减少人工干预,提高工作效率。参数自定义:用户可根据需求设定查询参......
  • 代码高手的过节秘籍:CodeArt Snap帮写代码,灵感弹指间实现
    本文分享自华为云社区《【端午特辑】代码高手的过节秘籍:CodeArtSnap帮写代码,灵感弹指间实现》,作者:华为云社区精选。端午将至,粽叶飘香,你却还在为一行行代码头疼?与bug缠斗不休?现在,基于盘古大模型技术打造的华为云智能开发助手CodeArtsSnap, 一键生成高效代码,精准解决技术难题,让......
  • 数据结构学习笔记-归并排序
    归并排序算法的设计与分析问题描述:设计并分析归并排序算法【算法设计思想】分割(Divide):从中间分割数组,使每个子数组包含一半的元素。这通过计算中点m来完成,通常是(l+r)/2,但为了防止大数溢出,使用l+(r-l)/2。解决(Conquer):递归地对两个子数组应用归并排序,直到......
  • 【大学物理】波动光学速成
     考点1光的干涉条件考点2杨氏双缝干涉s1为单峰屏,s2为双缝屏s为点光源,s1,s2为波阵面上两点,为新的子波波源p的坐标为x劳埃德镜实验:半波损失菲涅耳双镜实验考点3光程考点4等倾干涉......
  • 百度网盘不限速秘籍 让下载飞起来!
    在这个信息爆炸的时代,我们每天都在和时间赛跑。百度网盘,作为国内资源生态的领头羊,提供了一个强大的平台,让我们能够存储、备份、共享文件。但是,下载速度一直是让人头疼的问题。今天,我要和大家分享一个提速的秘方,让你的下载速度飙升至每秒70MB,甚至支持批量下载!首先,让我们来......
  • 巧用CMake编译策略:C++二次开发中的Release与Debug模式切换秘籍
    往期本博主的C++精讲优质博文可通过这篇导航进行查找:《Lemo的C++精华博文导航:进阶、精讲、设计模式文章全收录》前言在C++二次开发的过程中,理解各种编译模式并能灵活切换,对于提升软件性能和调试效率至关重要。本文将深入讨论Debug与Release模式的区别、默认编......