归并排序.

news2024/11/28 14:27:59

归并排序介绍

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用金典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而(conquer)的阶段则将分的阶段得到的各个答案"修补"在一起,即分而治之)

归并排序的思想示意图1-基本思想

说明
可以看到这种结构很像一棵完全二叉树,本文的归并排序采用递归去实现,(也可以采用迭代的范式去实现)阶段可以理解为就是递归查房子序列的过程.
在这里插入图片描述

归并排序思想示意图2,合并相邻有序子序列

再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并最终序列[1,2,3,4,5,6,7,8].来看下实现步骤
在这里插入图片描述

在这里插入图片描述

代码如下

package sort;

import java.util.Arrays;

public class MergetSort {
    public static void main(String[] args) {
     int[] arr={8,4,5,7,1,3,6,2};
     int[] temp=new int[arr.length];
     mergeSort(arr,0,arr.length-1,temp);
        System.out.println(Arrays.toString(arr));
    }

//分+合的一个方法
    public 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);
        }

    }


    //合并的方法.

    /**
     *
     * @param arr  排序的原始数组
     * @param left 左边有序序列的初始索引
     * @param mid 中间索引
     * @param right 右边索引
     * @param temp 做中转的数组
     */
    public static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i=left;//初始化i.左边有序序列的初始化索引
        int j=mid+1;//初始化j.右边有序序列的初始化索引
        int t=0;//指向temp数组的当前索引

        //一
        //先把左右两边(有序)的数据按照规则填充到temp数组
        //直到左右两边的有序序列,有一边处理完为止

        while (i<=mid&&j<=right){
            //如果左边的有序序列的当前元素,小于等于右边有序序列当前元素
            //我们就把左边的当前元素拷贝到我们的temp数组
            //然后我们的t和i都后移一下
            if(arr[i]<=arr[j]){
                temp[t]=arr[i];
                t+=1;
                i+=1;
            }else {//反之,将右边有序序列当前元素填充都temp数组
                temp[t]=arr[j];
                t+=1;
                j+=1;
            }
        }
         //二
        //把有剩余数据的一遍全部填充到temp去
        while (i<=mid){ //说明我们的左边的有序序列还有剩余元素,全部填充到temp
            temp[t]=arr[i];
            t+=1;
            i+=1;
        }
        while (j<=right){//说明我们的右边的有序序列还有剩余元素,全部填充到temp
         temp[t] =arr[j];
         t+=1;
         j+=1;
        }

        //三
        //将我们temp数组重写拷贝到arr
        //注意并不是每一次都拷贝所有
        t=0;
        int tempLeft=left;//
        System.out.println("tempLeft:"+tempLeft+"right=:"+right);
        while (tempLeft<=right){//
            arr[tempLeft]=temp[t];
            t+=1;
            tempLeft+=1;
        }
    }
}

我们归并排序的时间复杂度是比较小的.
**其实归并排序比较难以理解,我们如何分,如何合"这个思想的理解较难,代码看着没有什么感觉,但是先做一个了解把,大概知道,后面还要考自己多看,多理解,说不定那天就明白了.

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

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

相关文章

为什么程序员会秃头?盘点程序员糟心的几大因素

程序员与脱发似乎存在某种必然的逻辑连接&#xff0c;程序员秃头已经成为大家心中的思维定势。 一提到程序员&#xff0c;难免会想起来java&#xff0c; c&#xff0c; python以及无休止的debug环节&#xff0c;不难想象经常会有程序员跳楼自杀的情况。因为实在是生存不易&…

L5W1作业1 手把手实现循环神经网络

欢迎来到课程5的第一个作业&#xff01;在此作业中&#xff0c;你将使用numpy实现你的第一个循环神经网络。 循环神经网络&#xff08;RNN&#xff09;在解决自然语言处理和其他序列任务上非常有效&#xff0c;因为它们具有“记忆”&#xff0c;可以一次读取一个输入 x⟨t⟩x^…

C语言百日刷题第六天

C语言百日刷题第六天51.鸡兔同笼问题52.输出所有形如aabb的完全平方数53.3n1问题54.输出100~999的所有水仙花数55.韩信点兵56.倒三角形57.求子序列的和58.分数化小数59.开灯问题60.蛇形填数51.鸡兔同笼问题 分析&#xff1a;小学生数学问题。设鸡为a个&#xff0c;兔为b个&…

大数据技术基础实验十:Hive实验——新建Hive表

大数据技术基础实验十&#xff1a;Hive实验——新建Hive表 文章目录大数据技术基础实验十&#xff1a;Hive实验——新建Hive表一、前言二、实验目的三、实验要求四、实验原理五、实验步骤1、启动Hive2、创建表3、显示表4、显示表列5、更改表6、删除表或者列六、最后我想说一、前…

vue学习笔记——简单入门总结(三)

文章目录1.Vue的理解&#xff1a;1.1.mvvm模型&#xff1a;1.2.vue2的数据代理&#xff1a;1.3.vue2的生命周期&#xff1a;1.4.vue中的render函数&#xff1a;1.5. mixin混入&#xff1a;2.Vue组件间通信&#xff1a;2.0.props&#xff1a;2.1.全局事件总线&#xff1a;2.2.消…

WeMos Mini ESP32-S2FN4R2介绍

WeMos Mini ESP32-S2FN4R2介绍LOLIN S2 Mini V1.0.0 ESP32-S2 4MB FLASH 2MB PSRAM WIFI开发板 &#x1f33c;功能介绍 基于 ESP32-S2FN4R2TYPE-C USB27个数字输入/输出引脚&#xff0c;所有引脚都支持中断/pwm/I2C/单线ADC、DAC、I2C、SPI、UART、USB OTG &#x1f4cd; 详细…

棋盘(马蹄集)

棋盘 难度&#xff1a;白银 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 求一个N*N棋盘中的方块总数。 格式 输入格式&#xff1a;输入整型N 输出格式&#xff1a;输出整型 CSDN盛溪的猫 #include<bits/stdc.h> using namespace std; int main(){ long n,sum1;…

Mybatis要点总结

一、了解orm框架 1.什么是ORM框架&#xff1a;对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM&#xff09;&#xff0c;该模式是为了解决面向对象与关系数据库互补匹配的现象的技术&#xff1b;orm框架是连接数据库的桥梁&#xff0c;主要提供了人持久…

大数据技术之Zookeeper总结Ⅰ

zookeeper总结目录1. Zookeeper 入门1.1 zookeeper概述1.2 Zookeeper特点1.3 ZooKeeper 数据模型的结构2. Zookeeper 本地安装2.1 本地模式安装2.2 配置参数解读3. Zookeeper 集群操作3.1 集群操作3.2 Zookeeper 集群启动停止脚本3.3 客户端命令行语法1. Zookeeper 入门 1.1 z…

数据结构七:七大排序

目录 1&#xff1a;排序的概率 2.插入排序 2.1&#xff1a;直接插入排序-----稳定 2.1.1&#xff1a;基本思想 2.2&#xff1a;希尔排序 2.2.1&#xff1a;概念&#xff1a; 3.选择排序 3.1&#xff1a;选择排序 3.1.1&#xff1a;概念 3.2:堆排序 4.交换排序 4.1&…

微信小程序自动化测试之路

1. 前言 在每次发布新版本之前、都需要回归核心功能、已确保上线后小程序也能按照预期运行. 目前这部分回归工作是由测试同事手工去验证测试用例、按照每周一版本的迭代节奏、回归就花了测试挺多时间的. 最近前端工作比较轻松、故在思考能否把这部分重复的工作交给程序自动来进…

【EhCache: 一款Java的进程内缓存框架】EhCache 是什么、代码实战 Demo

文章目录1 EhCache 是什么2 代码实战 DemoTestEH.javaehcache.xml1 EhCache 是什么 Ehcache 是一种开源的、基于标准的缓存&#xff0c;可提高性能、卸载数据库并简化可扩展性。它是最广泛使用的基于 Java 的缓存&#xff0c;因为它健壮、经过验证、功能齐全&#xff0c;并且与…

python 基于PHP+MySQL的装修网站的设计与实现

至今为止,越来越多企业公司都已经实现了线上推广,提高了企业的运营工作效率,为装修公司设计一款强大的智能装修网,集企业信息展示和信息管理于一体,结合企业与外部的在线交流功能,主要用于大力宣传企业服务、企业产品等信息,让更多的人了解,提高企业的知名度 1&#xff1a;系统…

Spring Data Neo4j(1.对象映射)

文章目录一、Spring Data Neo4j二、注释NodeIdVersion(乐观锁)PropertyRelationship一、Spring Data Neo4j Spring Data Neo4j或简称SDN是下一代Spring Data模块&#xff0c;由Neo4j&#xff0c;Inc.创建和维护。与VMware的Spring Data Team密切合作。 它支持所有官方支持的Ne…

<Linux> shell运行原理及Linux权限的理解

文章目录一、shell 命令及其运行原理shell外壳shell运行原理二、Linux 权限的概念1.用户分类2.切换用户3.用户提权三、Linux 权限管理1.文件访问者的分类&#xff08;人&#xff09;2.文件类型和访问权限&#xff08;事物属性&#xff09;四、文件权限值的表示方法1.字符表示法…

Pycharm 配置远程SSH服务器环境(切换不同虚拟环境)

1.首先在Xshell上通过conda创建新的虚拟环境 2.此时在 /home/y210101004/.conda/envs下多了刚刚创建的环境的文件夹 3.路径说明&#xff01; &#xff08;注意&#xff01;&#xff09;该环境的编译器python3.6就在.../jiayan_test/bin里面 &#xff08;注意&#xff01;&…

04.函数

一、 函数 在计算机科学中&#xff0c;子程序&#xff08;英语&#xff1a;Subroutine, procedure, function, routine, method, subprogram, callable unit&#xff09;&#xff0c;是一个大型程序中的某部分代码&#xff0c; 由一个或多个语句块组 成。它负责完成某项特定任务…

ctfshow学习记录-misc入门(图片篇-颜色通道50-59)

目录misc50misc51misc52misc53misc54misc55misc56misc57misc58misc59misc51-52的wp和脚本参考的是csdn博主&#xff1a;z.volcano 九某人的碎碎念&#xff1a;这篇一更&#xff0c;说明近期是真的没有时间写wp了。虽说好多都是之前做过的题&#xff0c;但是wp整理起来还是比较耗…

OpenCV-Python 颜色识别(红色)并拟合矫正目标区域

OpenCV版本&#xff1a;4.6.0.66 算法实现思路&#xff1a; 颜色识别(红色)形态学去噪轮廓检测多边形拟合透视矫正代码实现&#xff1a; import cv2 import numpy as np# 可视化 def img_show(name, img):cv2.namedWindow(name, 0)cv2.resizeWindow(name, 1000, 500)cv2.imsh…

Java内存模型与volatile

Java内存模型 Java内存模型Java Memory Model&#xff0c;简称JMM&#xff0c;本身是一种抽象的概念并不真实存在它仅仅描述的是一组约定或规范&#xff0c;通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定一个线程对共享变量的写入何时以及如何变成对另…