算法通关村-----归并排序

news2024/12/24 8:26:50

基本原理

归并排序采用分治的思想,即分而治之,分就是将一个大问题分成一些小问题求解,治就是将分得的小问题得到的答案和在一起,得到最终的结果。体现在归并排序上,就是将大的数组分成小的序列,一直分到每个序列中只包含一个元素,此时序列内有序,然后两两合并,合并的方式即是合并两个有序数组,最终序列间有序,即整个数组有序,基本过程如下图所示
归并排序基本过程

代码实现

public void mergeSort(int[] array, int start, int end, int[] temp) {
	//2.直至每个序列只包含一个元素,停止划分
    if (start >= end) {
        return;
    }
    //1.从中间开始,每次划分为两个序列
    mergeSort(array, start, (start + end) / 2, temp);
    mergeSort(array, (start + end) / 2 + 1, end, temp);
    //3。进行有序数组的合并
    merge(array, start, end, temp);
}

public void merge(int[] array, int start, int end, int[] temp) {
	//找到序列中点
    int mid = (start + end) / 2;
    //left遍历左边的序列
    int left = start;
    //right遍历右边的序列
    int right = mid + 1;
    //index遍历临时数组,存储合并结果
    int index = 0;
    //两个序列均从起点到终点进行遍历
    while (left <= mid && right <= end) {
    	//将两个序列中较小的元素放入临时数组中
        if (array[left] < array[right]) {
            temp[index++] =array[left++];
        }else {
            temp[index++] =array[right++];
        }
    }
    //此时仅剩一个序列未遍历结束,直接赋值
    while (left <= mid){
        temp[index++] =array[left++];
    }
    while (right<=end){
        temp[index++] =array[right++];
    }
    //将归并的结果拷贝到原数组
    for (int i=start;i<=end;i++){
        array[i] = temp[i];
    }
}

例题分析

数组中的第K个最大元素

问题描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
详见leetcode215

问题分析

使用归并排序对数组进行从大到小的排序,排序后,返回数组下标为K-1的值,即为数组中第K大元素。

代码实现

public int findKthLargest(int[] nums, int k) {
    int[] temp = new int[nums.length];
    mergeSort(nums,0,nums.length-1,temp);
    return nums[k-1];
}

public void mergeSort(int[] array, int start, int end, int[] temp) {
    //2.直至每个序列只包含一个元素,停止划分
    if (start >= end) {
        return;
    }
    //1.从中间开始,每次划分为两个序列
    mergeSort(array, start, (start + end) / 2, temp);
    mergeSort(array, (start + end) / 2 + 1, end, temp);
    //3。进行有序数组的合并
    merge(array, start, end, temp);
}

public void merge(int[] array, int start, int end, int[] temp) {
    //找到序列中点
    int mid = (start + end) / 2;
    //left遍历左边的序列
    int left = start;
    //right遍历右边的序列
    int right = mid + 1;
    //index遍历临时数组,存储合并结果
    int index = left;
    //两个序列均从起点到终点进行遍历
    while (left <= mid && right <= end) {
        //将两个序列中较小的元素放入临时数组中
        if (array[left] > array[right]) {
            temp[index++] =array[left++];
        }else {
            temp[index++] =array[right++];
        }
    }
    //此时仅剩一个序列未遍历结束,直接赋值
    while (left <= mid){
        temp[index++] =array[left++];
    }
    while (right<=end){
        temp[index++] =array[right++];
    }
    //将归并的结果拷贝到原数组
    for (int i=start;i<=end;i++){
        array[i] = temp[i];
    }
}

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

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

相关文章

Android问题笔记 - 关于SuperNotCalledException报错异常信息的解决方案

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

解决win10远程桌面连接出现的“身份验证错误,要求的函数不支持”问题

用win10远程左面连接window服务器&#xff0c;出现上面问题。出现身份验证错误&#xff0c;要求的函数不支持。可以使用以下方法来解决&#xff1a; 1、winr键&#xff1a;输入gpedit.msc&#xff0c;然后回车 选择计算机配置>管理模板>系统>凭据分配>加密Oracle/…

四川云汇优想:短视频矩阵运营方案

短视频矩阵运营方案是为了提高短视频平台的用户黏性和活跃度&#xff0c;从而增强用户粘性和平台的商业价值而制定的。下面四川百幕晟小编将对短视频矩阵运营方案进行详细的介绍和分析。 首先&#xff0c;短视频矩阵运营方案要注重用户精细化运营。通过用户画像和兴趣标签&…

apple pencil一定要买吗?平价电容笔推荐

现在&#xff0c;电容笔在在线办公和在线教育领域非常流行&#xff0c;那么平替电容笔会不会代替原装的苹果笔呢&#xff1f;实际上&#xff0c;也不一定要买苹果的原装电容笔。一款平替式电容笔&#xff0c;售价只要一两百块钱&#xff0c;比苹果原装的那款电容笔要便宜不少&a…

众佰诚:抖音小店如何起店名好

在当今社会&#xff0c;随着互联网的发展&#xff0c;越来越多的人选择在网上开设自己的小店。抖音作为目前最受欢迎的短视频平台之一&#xff0c;也吸引了大量的商家入驻。那么&#xff0c;如何在抖音上开设一家有特色的小店呢?首先&#xff0c;我们需要为我们的小店起一个好…

LiveQing视频点播流媒体RTMP推流服务功能-如何配置资源进行轮巡播放视频轮播分屏展示

LiveQing视频点播流媒体RTMP推流服务功能-如何配置资源进行轮巡播放视频轮播分屏展示 1、分屏展示2、右击节点新建分组3、配置轮播间隔(秒&#xff09;4、选择资源5、轮巡播放6、停止分组播7、切换播放的流类型8、RTMP推流视频直播和点播流媒体服务 1、分屏展示 2、右击节点新建…

嵌入式实时操作系统的设计与开发 (第一级内存管理算法)

伙伴算法及实现上的改进 可变内存管理&#xff0c;随着内存的不断分配和回收&#xff0c;即使系统中有1MB的内存&#xff0c;也可能因没法分配大小为100KB的连续内存块而造成分配失败。 伙伴系统&#xff0c;可以大大改善这一情况。 伙伴系统的缺点&#xff1a; 仅管大小为2…

中了devos勒索病毒后如何正确解决,勒索病毒解密,数据恢复

对于企业来说&#xff0c;企业的计算机网络安全防护非常有必要&#xff0c;不然很容易被黑客攻击&#xff0c;最近一段时间我们接到客户求助&#xff0c;企业的服务器被Devos勒索病毒攻击&#xff0c;导致企业的计算机无法正常使用。经过云天数据恢复中心的工程师分析&#xff…

Talk | UCSD博士生刘明华:在开放的世界中理解和生成3D物体

本期为TechBeat人工智能社区第539期线上Talk。 北京时间10月19日&#xff08;周四&#xff09;20:00&#xff0c;加州大学圣地亚哥分校博士生—刘明华的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “在开放的世界中理解和生成3D物体”&#xff0…

未来装备探索:数字孪生装备

源自&#xff1a;《计算机集成制造系统》 作者&#xff1a;陶飞 张辰源 张贺 程江峰 邹孝付 徐慧 王勇 谢兵兵 “人工智能技术与咨询” 发布 摘 要 工程装备、制造装备、医疗装备等各类装备是加快国家基础建设&#xff0c;提升国家经济实力和保障医疗健康的重要…

【Linux07-进程间通信】侧重 管道 和 SystemV 的进程间通信讲解

今天&#xff0c;带来Linux下的进程间通信讲解。文中不足错漏之处望请斧正&#xff01; 是什么 进程间通信&#xff0c;Inter-Process Communication(IPC)&#xff1a; 进程间通过访问同一块内存空间来进行数据的交流。 为什么 为什么要有IPC&#xff0c;它的作用是什么&am…

AI杀疯!2023上半年至今有趣的AI算法(内附视频)

公众号&#xff1a;算法一只狗 文章目录 第一个&#xff0c;一切都可以进行分割第二个&#xff0c;开源图文回答工具第三个&#xff0c;视频转换风格生成第四个&#xff0c;免费好用的文档对话工具文档对话能力文档联系功能 今年&#xff0c;我们见证了人工智能算法的起飞&…

java如何导入导出excel

在Java中&#xff0c;可以使用多种方式导入和导出Excel文件。下面将详细介绍几种常见的方法及其实现步骤&#xff1a; 1. Apache POI库&#xff1a; Apache POI是一个开源的Java库&#xff0c;提供了许多类和方法用于处理Microsoft Office格式的文档&#xff0c;包括Excel文件…

关于刷题时使用数组的小注意事项

&#x1f4af; 博客内容&#xff1a;关于刷题时使用数组的小技巧 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#…

我们做播客这些年的自我进化

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 姝琦 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 这是一期荔枝播客十周年活动的特别节目&#xff0c;借这次机会&#xff0c;我们几位主播也借此机会沉淀下…

RHCE8 资料整理(二)

RHCE8 资料整理 第二篇 用户及权限管理第8章 用户管理8.1 基本概念8.2 管理用户8.2.1 创建用户8.2.2 修改用户属性 8.3 用户的密码策略8.4 用户授权8.5 重置root密码 第9章 权限管理9.1 所有者和所属组9.2 查看及修改权限9.3 数字权限9.4 默认权限9.5 特殊权限9.6 隐藏权限 第1…

C++前缀和算法应用:和至少为 K 的最短子数组的原理、源码及测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你一个整数数组 nums 和一个整数 k &#xff0c;找出 nums 中和至少为 k 的 最短非空子数组 &#xff0c;并返回该子数组的长度。如果不存在这样的 子数组 &a…

配置公网和私网用户通过非公网口的IP地址访问内部服务器和Internet示例

组网需求 如配置公网和私网用户通过非公网口的IP地址访问内部服务器和Internet示例所示&#xff0c;某小型企业内网部署了一台路由器、一台FTP服务器和一台Web服务器。路由器作为接入网关&#xff0c;为下挂的内网用户提供上网服务&#xff0c;主要包括浏览网页、使用即时通信…

短视频矩阵系统源头开发

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统&#xff0c;目前是全国源头独立开发)&#xff0c;开发功能大拆解分享&#xff0c;功能大拆解&#xff1a; 7大模型剪辑法&#xff08;数学阶乘&#x…

Flink之输出算子Data Sink

Flink之输出算子Data Sink Data Sink常见输出算子print()printToErr()writeAsText()writeAsCsv()writeToSocket() 常用连接器File Sink连接器Kafka Sink连接器RabbitMQ Sink连接器JDBC Sink连接器Elasticsearch Sink连接器MongoDB Sink连接器 自定义SinkRichSinkFunctionSinkFu…