排序之归并排序

代码

        先上代码,根据代码将归并排序的整个过程。

class Solution {public int[] sortArray(int[] nums) {int[] tmp = new int[nums.length];merge(nums, 0, nums.length - 1, tmp);return nums;}private void merge(int[] nums, int left, int right, int[] tmp){if(left == right) return;int mid = left + (right - left) / 2;merge(nums, left, mid, tmp);merge(nums, mid + 1, right, tmp);sort(nums, left, mid, right, tmp);}private void sort(int[] nums, int left, int mid, int right, int[] tmp){int l = left;int r = mid + 1;int idx = 0;while(l <= mid && r <= right){if(nums[l] < nums[r]){tmp[idx++] = nums[l++];}else{tmp[idx++] = nums[r++];}}while(l <= mid){tmp[idx++] = nums[l++];}while(r <= right){tmp[idx++] = nums[r++];}int pivot = left;idx = 0;while(pivot <= right){nums[pivot++] = tmp[idx++];}}
}
过程

        先整个数组。
请添加图片描述
        归并排序会借助一个数组辅助排序,用tmp表示,待排序数组,用nums表示。思想是自顶向下分,自底向上排。上述代码关键就是两个方法,一个是merge方法,一个是sort方法。
        首先找到数组的中间结点,为5。根据5,划分为数组的左侧[8, 12, 1, 5],数组的右侧[7, 9, 6]。左侧和右侧数组继续划分,如下图所示,直至left和right指针相等。
请添加图片描述
        划分完之后,merge有两种情况,一种情况如最后一个结点8,进入merge方法后,由于left == right,使得merge方法直接return;即仅有一个结点时,merge方法仅经过一条判断语句,就直接返回。还有一种情况是比如划分到[8, 12]时,进入merge方法,划分为[8]和[12],递归进入下一个merge方法,由于left==right,导致[8]和[12]的两个merge方法仅经过一条判断语句,直接return。回到[8,12]这个merge方法继续执行,即进入sort方法。
        [8,12]进入sort方法,l等于left,等于8,r等于mid+1,等于12。比较8和12,8小,将tmp数组的第一个元素赋值为8,l++,l++后,大于了mid,跳出第一个while循环,进入下一个循环,由于l大于mid,不进入第二个while循环,此时r还是小于right,会进入第三个循环,将tmp数组的第二个元素赋值为12。此时就完成了该数组中每个数字之间的相对顺序。将排好序的tmp数组,赋值给nums数组。
        再看一个例子,[8, 12, 1,5],l指向8,r指向mid+1,为1,此时,比较8和1的大小,1小,tmp数组第一个元素赋值为1,r++,指向5,比较8和5的大小,5小,将tmp数组的第二个元素赋值为5,r++,r大于right,跳出第一个while循环,第二个while循环,判断l是否小于mid,显然l指向为8,小于mid,将tmp中第三个元素和第四个元素赋值为8和12,跳出第二个while循环,此时r大于right,不会进入第三个while循环。最后将排序好的tmp的数组赋值给nums。
        在sort方法中,[left,mid]和[mid+1,right]两个数组一定满足从小到大的顺序,sort方法解决的问题是将两个升序数组借助一个tmp数组实现从小到大的排序问题。最后将tmp数组中的值赋值给原nums数组,就可以实现nums数组中[left,right]这个区间从小到大的排序。可以做一下合并两个有序数组。原理是一模一样的。
请添加图片描述

实战

        有些题目虽然是困难题,但是都是“纸老虎”,静下心来看,其实并不是很难。

  • 排序数组
  • 翻转对
  • 交易逆序对的总数

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kmeans聚类sklearn实现(Python实验)

Kmeans毫无疑问&#xff0c;好用又“便宜”的算法&#xff0c;经常在很多轻量化场景中实现。所谓的“聚类”&#xff08;Clustering&#xff09;&#xff0c;就是通过欧氏距离找哪些点构成一个簇。假设我们空间中有一堆点&#xff0c;通过肉眼大概可以看出有两簇&#xff0c;思…

OpenHarmony实战开发-如何实现图片缩放效果。

介绍 图片预览在应用开发中是一种常见场景&#xff0c;在诸如QQ、微信、微博等应用中均被广泛使用。本模块基于Image组件实现了简单的图片预览功能。 使用说明&#xff1a; 双指捏合对图片进行缩放双击图片进行图片的大小切换&#xff0c;在放大状态下&#xff0c;双击可恢复…

TensorFlow 1.x的学习

.为什么还有很多人都选择使用TensorFlow 1.x 兼容性问题: TensorFlow 1.x在一些旧项目中已经得到了广泛应用&#xff0c;这些项目可能依赖于1.x版本的特定API或行为。升级到2.x可能需要大量的代码修改和测试工作&#xff0c;对于一些已经稳定运行的项目&#xff0c;维护者可能…

内网渗透-内网环境下的横向移动总结

内网环境下的横向移动总结 文章目录 内网环境下的横向移动总结前言横向移动威胁 威胁密码安全 威胁主机安全 威胁信息安全横向移动威胁的特点 利用psexec 利用psexec.exe工具msf中的psexec 利用windows服务 sc命令 1.与靶机建立ipc连接2.拷贝exe到主机系统上3.在靶机上创建一个…

聚观早报 | 哪吒L上市定档;iPhone 16最新高清渲染图

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月10日消息 哪吒L上市定档 iPhone 16最新渲染图 华为太空表与问界M9联动 蔚来万里长城加电风景线正式贯通 Red…

基于Springboot+Vue的Java项目-房产销售系统(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

ubuntu16.04安装Eclipse C/C++

1.安装 JDK 官网源码安装 首先打开JDK官网&#xff0c;JDK1.8的下载网址为&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/#java8-windows&#xff0c;进入到网址如下图所示&#xff1a; 向下滑动到 JDK1.8的下载界面&#xff0c;如下图所示&#xff1a…

戏作打油诗《无知》

笔者经营多年的《麻辣崇州论坛》&#xff0c;半月前突被攻击我在“霸屏”&#xff0c;没处讲理&#xff0c;特戏作打油诗《无知》一首&#xff0c;为那个无理取闹、砸我“麻辣崇州论坛”的无知小儿画像如下。 请点击链接&#xff0c;一目了然&#xff1a;崇州论坛-麻辣社区 没…

2024-04-15_[UPnP]:详细解析

UPnP 一、论文阅读 1.2 Theory 1.2.1 Geometry of the absolute pose problem α i f i v i R p i t , i 1.. n . \alpha_i \mathbf{f}_i \mathbf{v}_i \mathbf{R} \mathbf{p}_i \mathbf{t} ,i1..n. αi​fi​vi​Rpi​t,i1..n. 其中&#xff1a; P i ∈ R 3 P_i \i…

幽灵漏洞进阶版来了

近日&#xff0c;网络安全研究人员披露了针对英特尔系统上 Linux 内核的首个原生 Spectre v2 漏洞&#xff0c;该漏洞是2018 年曝出的严重处理器「幽灵」&#xff08;Spectre&#xff09;漏洞 v2 衍生版本&#xff0c;利用该漏洞可以从内存中读取敏感数据&#xff0c;主要影响英…

STM32学习和实践笔记(5):时钟树

STM32一共有4个时钟源。外部时钟高低速各一个&#xff0c;内部时钟高低速各一个。 外部高速时钟是&#xff1a;4-16MHZ的HSE OSC。HS表示高速high speed. E表示外部的external。开发板该处安装的8M晶振。 外部低速时钟是&#xff1a;32.768KHz的LSI OSC。LS表示高速low speed…

【每日刷题】Day15

【每日刷题】Day15 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; 目录 1. 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 2. 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 3. 143. 重…