首页 > 其他分享 >归并排序的实现

归并排序的实现

时间:2024-11-14 23:44:07浏览次数:3  
标签:归并 right 实现 mid int array 排序 left

基本思想

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

代码:

1.排序

2.分解左子树,分解右子树,找中间值

3.合并

以4个值为例

定义S1,mid,s2,right

定义一个临时数组,存入元素,

每次S1和S2进行比较,谁小谁入,并向后走,谁先走完,把没走完的存入临时数组中,最后for循环遍历临时数组,把他里面的元素存入原数组中,注意存入时,原数组要用i+left,因为不加右边的左值的话,就一直存入的是以0下标开始的值。

public static void mergeSort(int[] array){
        mergeSortFunc(array, 0,array.length-1);
    }
    //左右递归
    public 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 left, int right, int mid) {
        int s1=left;
        int s2=mid+1;
        int[] tmpArr=new int[right-left+1];
        int k=0;//临时数组里的元素下标
        //证明两个区间都同时有数据
        while (s1 <= mid && s2 <= right) {
            if (array[s2] <= array[s1]) {
                tmpArr[k++] = array[s2++];
            } else {
                tmpArr[k++] = array[s1++];
            }
        }
        //若s1还有值
        while (s1<=mid){
            tmpArr[k++]=array[s1++];
        }
        //若s2还有值
        while (s2<=right){
            tmpArr[k++]=array[s2++];
        }
        //此时tmpArr里面一定是这个区间内有序数组了
        for (int i = 0; i < tmpArr.length; i++) {
            array[i+left]=tmpArr[i];//把右边的放进去
        }
    }

归并排序总结

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

标签:归并,right,实现,mid,int,array,排序,left
From: https://blog.csdn.net/2401_86415114/article/details/143754700

相关文章

  • Web前端之汉字排序、sort与localeCompare的介绍、编码顺序与字典顺序的区别
    MENU使用字典顺序对汉字进行排序(不支持多音字)编码顺序和字典顺序的区别sort与localeCompare的介绍使用字典顺序对汉字进行排序(不支持多音字)不使用拼音库,利用JavaScript的localeCompare方法直接按汉字的字典序排序。localeCompare可以在比较字符串时指定语言及排......
  • 提问:如何实现,我在docker container中,curl localhost:11434时,实际访问的是宿主机的1143
    背景我们需要在dify中配置ollama。ollama服务起来之后,会把服务挂在localhost的11434上。但是,我的dify一般是在docker里起的。所以我在dockercontainer里,访问localhost:11434时,实际无法访问到宿主机的11434,也就没办法调用宿主机上的ollama。怎么解决?方法一:找到宿主机......
  • asp.net程序设计1946婚庆策划网站的设计与实现(源码)婚礼策划网站
    项目包含:源码、讲解视频、说明文档,部署录像请查看博主个人简介开发环境开发工具:VisualStudio2010或以上版本数据库:SQLServer2005或以上版本开发语言:c#操作系统:windows7或以上浏览器:GoogleChrome(推荐)、Edge、360浏览器系统用户分为:管理员、普通用户界面设计......
  • 排序算法——冒泡排序
    目录一、冒泡排序的原理二、冒泡排序的过程三、代码实现总结一、冒泡排序的原理冒泡排序是一种简单的排序算法,它通过从左往右依次遍历,比较相邻元素的大小,并根据需要交换它们的位置来排序数据,以升序为例,这个过程类似空中的泡泡,重量大的往下沉,重量小的往上浮,从而得名冒泡......
  • 秒懂-----冒泡排序
    排序方法是一种重要的,基本的算法。我相信很多人学习的第一个排序算法就是冒泡排序。可是有很多人(包括作者本人)在开始学冒泡排序时,总是会有这种感觉------明明一听就懂,为何就是写不出代码!!归根结底时没有去深入它。何为冒泡生活中的冒泡请大家想象一口大锅,里面装满了水,现在......
  • 【简单的基于循环神经网络(RNN)的模型(深度学习经典代码实现)】
    importtorch#Code–Parametersinput_size=4hidden_size=4num_layers=1batch_size=1seq_len=5#Code–PrepareDataidx2char=['e','h','l','o']x_data=[1,0,2,2,3]y_data=[3,1,2,3,2]one_hot......
  • 【基于PyTorch的简单多层感知机(MLP)神经网络(深度学习经典代码实现)】
    importtorchfromtorchvisionimporttransformsfromtorchvisionimportdatasetsfromtorch.utils.dataimportDataLoaderimporttorch.nn.functionalasFimporttorch.optimasoptim#准备数据集batch_size=64transform=transforms.Compose([transforms.......
  • C语言:数组(一维数组,二维数组,数组越界,数组作为函数参量,冒泡排序)
    1、一维数组的创建和初始化1.1、数组的创建数组是相同类型元素的集合•数组中可以存放1个或者多个数据•数组中存放的数据,类型是相同的数组的创建方式:元素类型自定义数组名(常量表达式)比如:intarr[10]doublearr[5]chararr[8+5]错误写法:intarr[n];......
  • 基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现九
    一、前言介绍:免费获取:猿来入此1.1项目摘要随着信息技术的飞速发展和互联网的普及,教育领域正经历着深刻的变革。传统的面对面教学模式逐渐受到挑战,而在线课程学习教育系统作为一种新兴的教育形式,正逐渐受到广泛关注和应用。在线课程学习教育系统的出现,不仅为学生提供了更加灵......
  • 基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现十
    一、前言介绍:免费获取:猿来入此1.1项目摘要随着信息技术的飞速发展和互联网的普及,教育领域正经历着深刻的变革。传统的面对面教学模式逐渐受到挑战,而在线课程学习教育系统作为一种新兴的教育形式,正逐渐受到广泛关注和应用。在线课程学习教育系统的出现,不仅为学生提供了更加灵......