归并排序(java)

news2024/12/15 20:49:45

大家好我是苏麟 , 今天说说归并排序 . 

归并排序

递归

正式学习归并排序之前,我们得先学习一下递归算法。

定义:

定义方法时,在方法内部调用方法本身,称之为递归.

public void show(){
    System.out.println("aaaa");
    show();
}

作用:

它通常把一个大型复杂的问题,层层转换为一个与原问题相似的,规模较小的问题来求解。递归策略只需要少量的 程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

注意事项:

在递归中,不能无限制的调用自己,必须要有边界条件,能够让递归结束,因为每一次递归调用都会在栈内存开辟 新的空间,重新执行方法,如果递归的层级太深,很容易造成栈内存溢出。

需求:

请定义一个方法,使用递归完成求N的阶乘

分析:
1!: 1
2!: 2*1=2*1!
3!: 3*2*1=3*2!
4!: 4*3*2*1=4*3!
...
n!: n*(n-1)*(n-2)...*2*1=n*(n-1)!
所以,假设有一个方法factorial(n)用来求n的阶乘,那么n的阶乘还可以表示为n*factorial(n-1)

代码实现:

public class Test {
    public static void main(String[] args) throws Exception {
        int result = factorial(5);
        System.out.println(result);
    }
    public static int factorial(int n){
        if (n==1){
            return 1;
        }
        return n*factorial(n-1);
    }
}

归并排序

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

需求:

排序前:{8,4,5,7,1,3,6,2} 排序后:{1,2,3,4,5,6,7,8}

排序原理:

1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是 1为止。

2.将相邻的两个子组进行合并成一个有序的大组;

3.不断的重复步骤2,直到最终只有一个组为止。

代码 :

package src.sl.sort;


/**
 * 归并排序
 * 数据类型 : int
 */
public class MergeSort {
    //辅助数组
    public static int[] assist;

    public static void main(String[] args) {
        int[] arr = new int[]{2,5,6,1,3,2,4,8,6,7,5};

        sort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
    /**
     * 对数组全部排序
     *
     * @param arr
     */
    public static void sort(int[] arr) {

        assist = new int[arr.length];

        int left = 0;
        int right = arr.length-1;

        sort(arr, left, right);
    }

    /**
     * 对数组部分排序
     *
     * @param arr
     * @param left
     * @param right
     */
    public static void sort(int[] arr, int left, int right) {
        if (left >= right) {
            return;
        }

        int mid = left +  (right-left) / 2;
        sort(arr, left, mid);
        sort(arr,mid + 1,right);
        //归并
        merge(arr, left, mid, right);
    }


    /**
     * 归并
     *
     * @param arr
     * @param left
     * @param mid
     * @param right
     */
    public static void merge(int[] arr, int left, int mid, int right) {
        int i = left;
        int p1 = left;
        int p2 = mid + 1;

        while (p1 <= mid && p2 <= right){
            if (arr[p1] < arr[p2]){
                assist[i++] = arr[p1++];
            }else {
                assist[i++] = arr[p2++];
            }
        }

        while (p1 <= mid){
            assist[i++] = arr[p1++];
        }
        while (p2 <= right){
            assist[i++] = arr[p2++];
        }

        for (int j = left; j<=right;j++){
            arr[j] = assist[j];
        }
    }
}

这期就到这里 , 下期见!

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

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

相关文章

SEACALL海外呼叫中心系统的优势包括

SEACALL海外呼叫中心系统的优势包括 封卡封号问题解决 海外呼叫中心系统通过API开放平台能力&#xff0c;定制电话营销系统&#xff0c;提供多项功能如自动拨打、智能应答、真人语音交互等&#xff0c;帮助企业克服员工离职率高、客户资源流失严重等挑战。 - 高级管理者操控 …

《实现领域驱动设计》

DDD入门 1.1 DDD是什么&#xff1f; DDD是一种软件开发方法 DDD将领域专家和开发人员聚集到一起&#xff0c;开发的软件能够反映出领域专家的思维模型。目标是&#xff1a;交付最具业务价值的软件。DDD关注业务战略&#xff1a;指引我们如何实现面向服务架构&#xff08;ser…

开题报告怎么写?-案例+模板保姆级)

以前导师让们带本科生开题报告&#xff0c;我深知开题报告在学术研究中的重要性。一个出色的开题报告能够展示学生的科学思维、研究能力和创新潜力。 在本篇博客中&#xff0c;我将为大家详细介绍如何撰写史上最强开题报告。 将从课题的 科学意义国内外研究概况和发展趋势应…

SourceTree 使用

如何拉取远程仓库&#xff1f;如何拉去远程分支&#xff1f;如何创建本地分支&#xff1f;如何删除本地分支&#xff1f;如何删除远端分支&#xff1f; 删除了远程分支&#xff0c;如果本地还有此分支&#xff0c;那么是可以通过推送本地分支来还原远端分支。如何合并本地分支&…

2023中国计算机大会:蚂蚁集团连发两支百万级科研基金

10月26日&#xff0c;中国计算机学会&#xff08;CCF&#xff09;主办的第二十届中国计算机大会(CNCC2023)在沈阳举行。在“CCF-蚂蚁科研基金及产学研合作交流活动”上&#xff0c;蚂蚁集团发布了2023年度“CCF-蚂蚁科研基金”绿色计算及隐私计算两支百万级专项基金&#xff0c…

动态代理IP怎么设置?动态代理IP有哪些应用场景?

动态代理IP是指代理服务器会根据实际IP地址的变化而变化&#xff0c;可以帮助用户隐藏真实的IP地址&#xff0c;同时可以在不同的网络环境下使用不同的代理IP地址。下面是动态代理IP的设置和应用场景&#xff1a; 一、动态代理IP怎么设置&#xff1f; 1. 手动设置代理IP地址 用…

基于Arduino的物流分拣控制系统设计

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、控制系统设计1.1系统方案1.2 系统工作原理1.3方案设计1.3.1快递检测电路方案设计1.3.2控制电路方案设计 二、硬件…

【Java基础】File类与IO流

File类与IO流 文章目录 File类与IO流1. java.io.File类的使用1.1 概述1.2 构造器1.3 作用 2. IO流原理及流的分类2.1 流的分类2.3 流的API 3. 节点流之一&#xff1a;FileReader\FileWriter3.1 Reader与Writer3.3 关于flush&#xff08;刷新&#xff09; 4. 节点流之二&#xf…

GPIO常见名词——推挽、开漏、浮空、上拉、下拉、高阻态

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 1、前言…

VTK OrientationMarker 方向 三维坐标系 相机坐标轴 自定义坐标轴

本文 以 Python 语言开发 我们在做三维软件开发时&#xff0c;经常会用到相机坐标轴&#xff0c;来指示当前空间位置&#xff1b; 坐标轴效果&#xff1a; 相机方向坐标轴 Cube 正方体坐标轴 自定义坐标轴&#xff1a; Code&#xff1a; Axes def main():colors vtkNamedC…

以太网通讯与485通讯哪个好?

随着工业自动化、物联网和信息技术的快速发展&#xff0c;数据传输成为了各个领域越来越关注的问题。在众多通讯技术中&#xff0c;以太网通讯和485通讯被广泛应用于各种场景。那么&#xff0c;这两种通讯技术究竟哪个更好呢&#xff1f;接下来&#xff0c;小编就来为大家一一讲…

使用Terraform管理已经存在的kubernates和默认的节点池

背景&#xff1a; 通过terraform resource "alicloud_cs_managed_kubernetes" "k8s" {...}创建集群时&#xff0c;会产生一个默认的节点池default-nodepool&#xff0c;但是如何去修改这个默认节点池的信息呢&#xff1f; 解决思路&#xff1a; 因为Ter…

LLM系列-大模型技术汇总

LLM系列-大模型技术汇总 1. 大模型技术汇总-参数高效迁移学习方法2. 千亿模型并行训练技术2.1. 数据并行&#xff08;Data Parallelism&#xff0c;DP&#xff09;2.2. 模型并行&#xff08;Model Parallelism&#xff0c;MP&#xff09;2.2.1. 流水线并行&#xff08;Pipeline…

Ubuntu16.04 python matplotlib 输出轴标签出现中文乱码

问题&#xff1a;坐标轴打印中文时&#xff0c;显示会乱码 import matplotlib.pyplot as plt plt.ylabel(时间刻度)原因&#xff1a;matplotlib里面没有中文字体解决方法&#xff1a;下载SimHei字体&#xff0c;快捷方法是使用everything直接在windows搜索simhei.ttf&#xff…

【0230】PG内核底层事务(transaction)实现原理之基础篇

1. 事务上层 事务是如何工作? 接下来让我们通过gdb方式来跟踪一下PG内核中事务的底层工作原理。 (1)psql登录PG服务(2)psql登录界面输入:begin(3)gdb跟踪backend进程读取用户的输入,并进入exec_simple_query()函数函数exec_simple_query()的实现如下: static void …

JAVA实现学生日常行为评分管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2.1 登录注册模块2.2.2 用户管理模块2.2.3 评分项目模块2.2.4 评分数据模块2.2.5 数据字典模块 2.3 可行性设计2.4 用例设计2.5 数据库设计2.5.1 整体 E-R 图2.5.2 用户2.5.3 评分项目2.5.4 评分数据2.5.…

PyTorch入门教学——torchvision中数据集的使用

1、torchvision.datasets datasets是torchvision工具集中的一个工具。可以理解为调用官方数据集的一种方式&#xff0c;其中有很多开源的数据集&#xff0c;可供我们学习使用。datasets官网&#xff1a;Datasets — Torchvision 0.16 documentation (pytorch.org) 2、使用 …

【漏洞复现】用友OA用户信息泄露

漏洞描述 通过该接口可下载oa用户信息文件 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利用文章中的技…

链游风暴再起?MBOX即将再度起飞

近期链游再次进入了我们的视野&#xff0c;Play To Earn在21年大放异彩之后经过了2年沉寂近期终于有了再度爆发的征兆&#xff0c;不管是前段时间爆拉7倍的YGG&#xff0c;还是近期一路高歌猛进的MC都已经吹响了链游板块即将冲锋的信号&#xff0c;那么近期还有哪些值得关注的链…

element form中input使用@keyup.enter.native回车页面刷新问题

当form中只有一个文本框的时候&#xff0c;使用keyup.enter.native会自动触发form的submit提交事件 地址栏会多出来一个? 解决方案&#xff1a; 在form中添加 submit.native.prevent ,阻止form提交默认事件