当前位置: 首页 > news >正文

归并排序算法

ced485cbb11e458d81a746890b32cf3f.gif

作者:敲代码の流川枫

博客主页:流川枫的博客

专栏:和我一起学java

语录:Stay hungry stay foolish

工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网

点击免费注册和我一起刷题吧    

文章目录

1. 算法思想

2. 算法图解

3. 代码实现

4. 算法特点


1. 算法思想

 主要思想:

 对于给定的一组数据,利用递归分治技术将数据序列划分成越来越小的半子表,在对半子表排序后,再用递归方法将排序好的半子表合并成为越来越大的有序序列,具体步骤看下面的图解

2. 算法图解

int[] array = {30,60,40,10,80,20,50,70};

以数组array为例降序分析

先将数组分为左右子表 

 将左右子表继续拆分,知道只有两个元素时,开始比较并排序

 接下来将有序的子表进行合并,产生一个新的数组用来存放排序结果

为了提升性能,有时在半子表的个数小于某个数的情况下,对半子表的排序采用其他排序算法,例如插入排序等

将两个有序表合并成一个有序表,称为2—路归并,对应的就有多路归并

3. 代码实现

代码:

import java.util.Arrays;

public class MergeSort {
    public int[] sortArray(int[] nums){
        if(nums.length<2){
            return nums; 
        }
        //切分数组,然后递归排序 ,并用merge合并
        int mid = nums.length/2;
        int[] left = Arrays.copyOfRange(nums,0,mid);
        int[] right = Arrays.copyOfRange(nums,mid,nums.length);
        return merge(sortArray(left),sortArray(right));
    }
    
    public static int[] merge(int[] left,int[] right){
        int[] result = new int[left.length+ right.length];
        for (int index = 0,i=0,j=0;index < result.length;index++){
            if(i>= left.length){
                result[index] = right[j++];
            } else if (j >= right.length){
                result[index] = left[i++];
            } else if (left[i]>right[j]) {
                result[index] = right[j++];
            } else {
                result[index] = left[i++];
            }
        }
        System.out.println("左子数组:");
        PrintArray.print(left);
        System.out.println("右子数组:");
        PrintArray.print(right);
        System.out.println("合并后的数组");
        PrintArray.print(result);
        System.out.println("-----------");
        return result;
    }

    public static void main(String[] args) {
        int[] nums = {32,12,1,12,23,45,11,100,55,76,34};

        int[] array = new MergeSort().sortArray(nums);
    }

}
class PrintArray{
    public static void print(int[] nums){
        System.out.println(Arrays.toString(nums));
    }
}

结果:

4. 算法特点

时间复杂度:
每次将序列折半分组,共需要logn轮,因此归并排序算法的时间复杂度是O(nlogn)

空间复杂度:
排序过程中需要额外的一个序列去存储排序后的结果,所占空间是n,因此空间复杂度为O(n)

稳定性:
在排序过程中,相同元素的前后顺序并没有改变,是一种稳定排序算法

“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!

ced485cbb11e458d81a746890b32cf3f.gif

 

相关文章:

  • DNSPod十问百果园焦岳:为什么开水果店是一门高科技生意?
  • 《nginx》三、nginx负载均衡
  • 操作系统——程序地址空间
  • JavaScript-操作表单和前端加密
  • 使用disruptor队列实现本地异步消费
  • 在Windows中自动压缩备份文件和目录的脚本
  • 猿创征文|Java计算【生日工具类】看这篇就够了
  • 网络-电脑网络突然变成球形, 网络不可用
  • 848. 有向图的拓扑序列(BFS应用)
  • 物联网开发笔记(8)- 使用Wokwi仿真ESP32开发板实现模数转换和脉宽调制
  • 古怪的Lucene中文分词方案 —— CJKAnalyzer
  • SPDK vhost-user结合SPDK NVMe-oF RDMA性能调优
  • mysql 创建函数
  • 支持十亿级密态数据、低代码,蚂蚁集团发布隐语开放平台
  • 关于kafka常见名词解释,你了解多少?
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【前端学习】-粗谈选择器
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • extract-text-webpack-plugin用法
  • Hibernate最全面试题
  • HTTP中的ETag在移动客户端的应用
  • JavaScript服务器推送技术之 WebSocket
  • JavaScript实现分页效果
  • Java新版本的开发已正式进入轨道,版本号18.3
  • js中forEach回调同异步问题
  • PHP的类修饰符与访问修饰符
  • spring-boot List转Page
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue-router的history模式发布配置
  • vuex 笔记整理
  • 关于Java中分层中遇到的一些问题
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 小而合理的前端理论:rscss和rsjs
  • 硬币翻转问题,区间操作
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​批处理文件中的errorlevel用法
  • ​人工智能书单(数学基础篇)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (02)Hive SQL编译成MapReduce任务的过程
  • (day 12)JavaScript学习笔记(数组3)
  • (六)Hibernate的二级缓存
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)jdk与jre的区别
  • (转)编辑寄语:因为爱心,所以美丽
  • .md即markdown文件的基本常用编写语法
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .net实现头像缩放截取功能 -----转载自accp教程网