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

news2024/12/23 4:02:29

文章目录

  • 一、排序的概念
    • 排序的概念
    • 排序的稳定性
    • 七大排序算法
  • 二、归并排序
    • 核心思想
    • 代码实现
  • 三、性能分析
  • 四、七大排序算法性能对比


一、排序的概念

排序的概念

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

排序的稳定性

在这里插入图片描述
上述待排序的数中,有两个5。 将前面的5标记一个a, 将后面的5标记一个b。

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

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


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


七大排序算法

在这里插入图片描述


二、归并排序

核心思想

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

图解

有一组待排序数列,我们进行升序排序。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
拆分过程:将一个数组逐层拆分成多个子序列,直到每个子序列只剩一个数据,那么就认为这个子序列是有序的。
合并过程:再逐一将这些子序列进行有序合并,最后得到的序列就是有序的。


代码实现

代码实现

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)
稳定性:稳定


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

在这里插入图片描述

想学哪个点哪个
归并排序讲解
快速排序讲解
直接插入排序讲解
希尔排序讲解
直接选择排序讲解
堆排序讲解
冒泡排序讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/751450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java的考研教室在线预约系统/基于springboot的考研教室在线预约系统

摘 要 网络的广泛应用给生活带来了十分的便利。所以把考研教室在线预约与现在网络相结合&#xff0c;利用java语言建设考研教室在线预约系统&#xff0c;实现考研教室在线预约的信息化。则对于进一步提高考研教室在线预约发展&#xff0c;丰富考研教室在线预约能起到不少的促进…

Spark编程-RDD

RDD创建方式 第一种&#xff1a; 读取外部数据集。例如&#xff1a;从本地文件加载数据集&#xff0c;或者从HDFS文件系统、HBase等外部数据源中加载数据集。 Spark可以支持文本文件、SequenceFile文件&#xff08;Hadoop提供的 SequenceFile是一个由二进制序列化过的key/valu…

MySQL的数据备份与还原--练习题

MySQLdump MySQLdump是MySQL提供的一个非常有用的数据库备份工具。MySQLdump命令执行时&#xff0c;可以将数据库备份成一个文本文件&#xff0c;该文件中实际上包含了多个CREATE 和 INSERT语句&#xff0c;使用这些语句可以重新创建表和插入数据。 看题&#xff1a; 第一题&a…

开源共建,360推出WatchAD2.0域安全威胁感知系统新版本

不论是在攻防演练还是真实入侵对抗场景中&#xff0c;攻击者往往通过攻击域控获取特权管理权限进而横向控制企业内网&#xff0c;窃取重要资产和数据&#xff0c;凭借独特的管理优势&#xff0c;AD域被广泛应用于大型企业的IT基础设施的集中管理。 然而&#xff0c;传统的网络…

【手撕C语言基础】结构体(2)

(꒪ꇴ꒪(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误…

微服务-Nacos环境安装

文章目录 1. 微服务1.1 微服务概括 2. 微服务框架2.1 Spring Cloud2.2 Spring Cloud alibaba/Spring Cloud Netflix2.3微服务框架组件(alibaba) 3 Nacos3.1 Nacos介绍3.3 Naocs工作结构3.3 Nacos功能3.4 环境准备下载安装 1. 微服务 1.1 微服务概括 单体架构有问题,所以做项目…

【uniapp开发小程序】设置开屏广告,广告图片全屏、覆盖自带胶囊导航

效果图&#xff1a; 点击跳转其他小程序&#xff1a; uni.navigateToMiniProgram() 官方文档&#xff1a;uni.navigateToMiniProgram(OBJECT) | uni-app官网 // 示例代码 uni.navigateToMiniProgram({appId: ,path: pages/index/index?id123,extraData: {data1: test},succes…

最新AI换脸替换工具离线版,一张图实现视频或者图片换脸

最新AI换脸替换工具离线版&#xff0c;一张图实现视频或者图片换脸 AI换脸替换工具离线版 基于开源项目&#xff0c;做了如下的小工具&#xff0c;给定一张人脸图&#xff0c;即可实现将某视频或者图片的人脸替换成给定的人脸。 软件操作依然很简单&#xff0c;鼠标悬停问号都…

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

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、冒泡排序核心思想代码实现 三、性能分析四、七大排序算法 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或…

Nacos注册与配置中心:使用详讲

文章目录 注册1. 引入依赖2. yaml配置设置命名空间注册信息在nacos中的内存状态总结nacos的服务注册发现机制 配置中心应用场景配置中心运行结构远程配置:1. 在本地进程添加config 依赖 和bootstrap依赖2. 需要引入一个bootstrap.yaml文件 案例练习 注册 所有组件配置步骤-大三…

面向Web开发人员的Linux实用入门(转)

从 web 开发的视角说一下在使用 Linux 时遇到的问题&#xff0c;主要是针对操作本身&#xff0c;因为指令在网上都可以查到&#xff0c;不会深入原理&#xff0c;但尽量实用。 基础认知 为什么使用 Linux 最初我使用 Linux 是因为我需要的应用在教程里只提供了 Linux 版本&a…

一、Dell服务器的iDRAC管理卡连接

Dell服务器的iDRAC管理卡图文教程 1、网线连接idrac口2、查看idrac地址3、匹配IP地址4、web登录idrac页面5、登录成功页面 带有集成戴尔远程访问控制器 &#xff08;idrac&#xff09;的系统具有默认用户名和密码&#xff0c;但您也可以使用安全密码对其进行配置。默认使用web浏…

【设计模式】简易俄罗斯转盘实现JAVA

大家好哇&#xff0c;我是梦辛工作室的灵&#xff0c;最近有些无聊&#xff0c;没得什么事情做&#xff0c;所以想再熟悉熟悉设计模式吧&#xff0c;然后就写了个俄罗斯转盘玩&#xff0c;还是老样子先看结果&#xff1a; 看上去还是不错的吧&#xff0c;最后那个只是打印&…

数学建模 插值算法

有问题 牛顿差值也有问题它们都有龙格现象&#xff0c;一般用分段插值。 插值预测要比灰色关联预测更加准确&#xff0c;灰色预测只有2次 拟合样本点要非常多&#xff0c;样本点少差值合适

Qt 桌面系统设计

文章目录 前言一、项目介绍二、界面布局三、按键图标四、桌面背景五、实现led功能总结 前言 这篇文章介绍 一个Qt 桌面系统的项目&#xff0c;大家可以在此基础上加以改进&#xff0c;实现更多的功能。 一、项目介绍 可以看到 这个桌面系统上分为两部分&#xff0c;左边是 三个…

在Linux上 USRP RIO 2944 使用 PCIe

支持的硬件 USRP-2900USRP-2901USRP-2920USRP-2921USRP-2922USRP-2930USRP-2932USRP-2940 40 MHzUSRP-2940 120 MHzUSRP-2942 40 MHzUSRP-2942 120 MHzUSRP-2943 40 MHzUSRP-2943 120 MHzUSRP-2944USRP-2945USRP-2950 40 MHzUSRP-2950 120 MHzUSRP-2952 40 MHzUSRP-2952 120 MH…

【Unity面试篇】Unity 面试题总结甄选 |算法相关 | ❤️持续更新❤️

前言 之前整理了一篇关于Unity面试题相关的所有知识点&#xff1a;2022年Unity 面试题 |五萬字 二佰道| Unity面试题大全&#xff0c;面试题总结【全网最全&#xff0c;收藏一篇足够面试】为了方便大家可以重点复习某个模块&#xff0c;所以将各方面的知识点进行了拆分并更新整…

山西电力市场日前价格预测【2023-07-14】

日前价格预测 预测明日&#xff08;2023-07-14&#xff09;山西电力市场全天平均日前电价为315.29元/MWh。其中&#xff0c;最高日前价格为386.08元/MWh&#xff0c;预计出现在21: 45。最低日前电价为232.93元/MWh&#xff0c;预计出现在14: 45。 价差方向预测 1&#xff1a;实…

利用windows恶意软件获取windows主机shell

实验目的&#xff1a; 模拟黑客利用windows恶意软件获取windows主机shell权限的过程 熟悉操作使用的命令实验准备&#xff1a; kali 同网段的windows主机&#xff08;关闭防火墙&#xff09; msfvenom是一个Metasploit独立的有效负载生成器&#xff0c;也是msfpayload和msfenco…

【大数据之Hive】二十二、HQL语法优化之Join优化

主要控制优化使用哪种join算法。 1 Common Join Common Join是Hive中最稳定的join算法也是默认的join算法&#xff0c;其通过一个MapReduce Job完成一个join操作。Map端负责读取join操作所需表的数据&#xff0c;并按照关联字段进行分区&#xff0c;通过Shuffle&#xff0c;将…