首页 > 编程语言 >归并排序算法详解

归并排序算法详解

时间:2023-10-03 17:23:17浏览次数:59  
标签:归并 end int 算法 详解 有序 序列 排序

算法介绍

引用百度百科的介绍。

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

算法描述

归并排序,采用是分治法,先将数组分成子序列,让子序列有序,再将子序列间有序,合并成有序数组。

算法描述:

(1)把长度为n的输入序列分成长度 n/2的子序列;
(2)对两个子序列采用归并排序;
(3)合并所有子序列。

算法实现

    void mergeSortInOrder(int[] arr,int bgn,int mid, int end){
        int l = bgn, m = mid +1, e = end;
        //相当于对一个数组的前半部分和后半部分进行排序排序,从开始的只有两个数,到后面
        //因为基本有序,所以只需要进行合并就行
        int[] arrs = new int[end - bgn + 1];
        int k = 0;
        //进行有序合并
        while(l <= mid && m <= e){
            if(arr[l] < arr[m]){
                arrs[k++] = arr[l++];
            }else{
                arrs[k++] = arr[m++];
            }
        }
        //如果前半部分大的比较多,直接接在后面
        while(l <= mid){
            arrs[k++] = arr[l++];
        }
        //如果后半部分大的比较多,直接接在后面
        while(m <= e){
            arrs[k++] = arr[m++];
        }
        //对我们原来的数组进行值的覆盖
        for(int i = 0; i < arrs.length; i++){
            arr[i + bgn] = arrs[i];
        }
    }
     void mergeSort(int[] arr, int bgn, int end){
        //如果开始指针大于结束指针,结束
        if(bgn >= end){
            return;
        }
        //通过分治将我们的数组分成多个小数组
        int mid = (bgn + end) >> 1;
        mergeSort(arr,bgn,mid);
        mergeSort(arr,mid + 1, end);
        //对我们的小数组进行排序
        mergeSortInOrder(arr,bgn,mid,end);
    }

算法分析

稳定排序

外排序(需要消耗额外的内存)

时间复杂度O(nlogn),空间复杂度为O(1)

上一篇堆排序算法图文详解(模版使用) 下一篇操作系统【进程管理之进程与线程篇】  

本文作者:CryFace

本文链接:https://www.cnblogs.com/CryFace/p/13706441.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

分类: 标签: 好文要顶 关注我 收藏该文 CryFace
粉丝 - 30 关注 - 23
    +加关注 0 0       « 上一篇: 堆排序算法图文详解(模版使用)
» 下一篇: 操作系统【进程管理之进程与线程篇】

标签:归并,end,int,算法,详解,有序,序列,排序
From: https://www.cnblogs.com/zhou111f/p/17741331.html

相关文章

  • Pytorch nn.Linear的基本用法与原理详解
    Pytorchnn.Linear的基本用法与原理详解原文:Pytorchnn.Linear的基本用法与原理详解_iioSnail的博客-CSDN博客nn.Linear的基本定义nn.Linear定义一个神经网络的线性层,方法签名如下:torch.nn.Linear(in_features,#输入的神经元个数out_features,#输出神经元个数......
  • 插入排序:简单而有效的排序方法
    在计算机科学中,排序算法是一个重要且常见的主题,它们用于对数据进行有序排列。插入排序(InsertionSort)是其中一个简单但有效的排序算法。本文将详细解释插入排序的原理和步骤,并提供Java语言的实现示例。插入排序的原理及性能分析插入排序的核心思想是逐个将未排序的元素插入到已排序......
  • Nginx listen 监听端口详解
    listen指令监听端口:listenaddress:port[default|default_server|[backlog=num|rcvbuf=size|sndbuf=size|accept_filter|deferred|bind|ipv6only=[on|off]|ssl]];默认:listen80配置块:server含义指定服务监听的地址,如果使用IP协议,则可以包......
  • shell 循环读取文件中每一行的方法详解
    当需要在shell脚本中读取文件中的每一行进行处理时,可以使用while循环或for循环。下面将详细介绍这两种方法。 方法一:使用while循环使用while循环是一种常见的读取文件中每行的方法。该方法的基本语法如下:whilereadlinedo#处理每一行的代码done<filename其中,readline......
  • Shell 函数详解(函数定义、函数调用、参数变量)
    Shell函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。Shell中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别。Shell函数定义的语法格式如下:functionname(){statements[re......
  • C++ 对拍详解 和解读
    对拍是什么#​对拍,是一个比较实用的工具。它能够非常方便地对于两个程序的输出文件进行比较,可以帮助我们实现一些自动化的比较输出结果的问题。​众所周知,几乎每一道编程题目,都会有某种正解能拿到满分;当我们想不出正解时,我们往往可以打暴力代码来获取部分分数。​但是,当我们觉......
  • destoon 列表页面增加手动选择排序方式
    在mobile/include/mall.inc.php 行60 $order=$MOD['order'];  之前增加排序方式判断如果有order参数则$order接受参数,没有就用默认  $order=$MOD['order'];  1、增加排序以后的mobileurl函数,伪静态规则  ViewCode 伪静态规则 ViewCode  2、模......
  • DESTOON做中英双语言(多语言)切换版本具体详解
    第一次发原创好激动,该注意点什么?在开发过程中用户有许多要求,比如这个多语言切换就是一个需求。首先讲解一下DESTOON(DT)后台系统如何做这个中英、甚至多语言切换的这个功能。DT本身不自带多语言切换功能,但是强大的DT可以切换默认语言和默认模板的。首先登陆后台系......
  • 计算机初级选手的成长历程——扫雷详解
    大家好,很高兴又和大家见面啦!在上一篇内容中,我们详细介绍了三子棋的编写思路,相信大家在阅读完上一篇后对相关的知识点及其运用也有了相应的提升。下面我们就来开始介绍今天的内容——扫雷。扫雷游戏介绍游戏规则扫雷的游戏规则很简单。盘面上有许多方格,方格中随机分布着一些雷。你的......
  • P2824 [HEOI2016/TJOI2016] 排序
    针对区间排序,显然能够上值域线段树类似,但这里有个更强的做法。如果能转化成01序列,那么一个区间排序的时候,只需区间询问1的个数+区间修改就可以了。因为是排列,很清晰的二分一个mid,把大于等于它的设为1,小于它的设为0,再跑上面的算法,最后check一下询问位置是否为1即可。单调性?感性......