【数组】-Lc912-数组排序(冒泡、选择,快排)

写在前面

  最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。


目录

  • 写在前面
  • 一、场景描述
  • 二、具体步骤
    • 1.环境说明
    • 2.代码
  • 写在后面


一、场景描述

  给定一个长度为 n 的数组,请你编写一个函数,返回该数组按升序排序后的结果。
要求:时间复杂度 O(n^2),空间复杂度 O(n)
进阶:时间复杂度 O(nlogn),空间复杂度 O(n)

示例:
输入:[5,2,3,1,4]
返回:[1,2,3,4,5]说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。注:本题数据范围允许绝大部分排序算法,请尝试多种排序算法的实现。

二、具体步骤

1.环境说明

名称说明
IntelliJ IDEA2019.2

2.代码

以下为Java版本实现:

public class Lc912_sort {public static void main(String[] args) {
//        int[] nums = {5, 3, 2, 4, 1};int[] nums = {2, 1, 4, 9};System.out.println(Arrays.toString(nums));//        bubbleSort(nums);
//        selectSort(nums);quickSort(nums, 0 , nums.length - 1);System.out.println(Arrays.toString(nums));}/*** nlogn** 快速排序** 思路:递归* 以首元素为基准值 pivot,在给定区间[low, high], 从右向左 j 找比 pivot 小的值,从左向右 i 找比 pivot 大的值,两两交换* 直到 i >= j,跳出循环(此时 i 左边的都比 pivot 小)* 把 pivot 和 nums[i] 交换* 然后分别递归 基准值i 的左部分和右部分** 通过一趟排序,得到一个基准值 pivot,左边的都比 pivot 小,右边的都比 pivot 大,然后【递归】左右* 注意:如果 pivot = nums[low],那么必须 j 指针先走,找到一个比 i 小的值才交换,否则会出错** 没有返回值** 定义 pivot = nums[low], i = low, j = high* while循环(i < j) i 和 j 交换* 1、j 从右向左,找到比 pivot 小的 while(i < j && num[j] >= pivot) j--* 2、i 从左向右,找到比 pivot 大的 while(i < j && nums[i] <= pivot) i++* 3、if (i < j) 则交换nums[i]和nums[j]的值** 交换基准值,nums[low] = nums[i], nums[i] = pivot** 递归左右序列* quickSort(nums, low, i -1)* quickSort(nums, i + 1, high)** @param nums* @param low* @param high*/private static void quickSort(int[] nums, int low, int high) {// 递归结束条件if (low > high) {return;}// 初始基准值int pivot = nums[low], i = low, j = high;while (i < j) {// 从右向左,找比pivot小的值while (i < j && nums[j] >= pivot) {j--;}// 从左向右,找比pivot大的值while (i < j && nums[i] <= pivot) {i++;}if (i < j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}// 设置基准值nums[low] = nums[i];nums[i] = pivot;// 递归左右quickSort(nums, low, i - 1);quickSort(nums, i + 1, high);}/*** n^2** 选择排序* 双层循环,直接操作原数组,没有返回值** 思路:* 拿当前数,和后面的所有数比较,最终确定下来一个数** 从左到右,拿第一个数和后面的数比较,确定的是第一个数* 第一层循环确定第一个数,第二层循环后面的数** 2 层for循环* 第 1 层:i 的值最大到 length-2(倒数第2个元素), for (int i = 0; i < nums.length - 1; i++)* 第 2 层:j 的值最大到 length-1(最后1个元素),for(int j = i + 1; j < nums.length; j++)* 比较nums[i]与num[j]** @param nums*/private static void selectSort(int[] nums) {for (int i = 0; i < nums.length - 1; i ++) {for (int j = i + 1; j < nums.length; j++) {// 找出最小值,从小到大排列if (nums[i] > nums[j]) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}}}/*** n^2** 冒泡排序* 双层循环,直接操作原数组,没有返回值** 思路:** 两两比较,每趟能确定一个数* 两层for循环* 第一层循环控制趟数,确定第二层循环的最大值* 第二层循环用于比较** 2层for循环* 第 1 层,i 的值为趟数(2个数1趟;3个数2趟),for(int i = 0; i < num.length -1; i++)* 第 2 层,j 的值最大到length-2,比较交换,for(int j = 0; j < num.length -1 -i; j++)* 比较 num[j]与 [j+1] 的值进行交换** @param nums*/private static void bubbleSort(int[] nums) {for (int i = 0; i < nums.length - 1; i++) {for (int j = 0; j < nums.length - 1 -i; j++) {// 找出最大的数,从小到大排列if (nums[j] > nums[j + 1]) {int temp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = temp;}}}}}

写在后面

  如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。

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

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

相关文章

C语言——双向链表的实现

双向链表是一种更复杂的链表结构&#xff0c;其中每个节点都有两个链接&#xff0c;一个指向前一个节点&#xff0c;另一个指向下一个节点。这种结构使得在双向链表中遍历数据更为高效&#xff0c;因为可以从两个方向进行遍历。 结构 数据域&#xff1a;存储实际数据。指向前…

数据库(表的基本操作)

目录 1.1 表的基本操作 1.1.1 创建表 1.1.2 表物理存储结构 1.1.3 数据类型 文本类型&#xff1a; 数字类型&#xff1a; 时间/日期类型&#xff1a; 常用的数据类型&#xff1a; 1.1.4 查看表 SHOW 命令 查看表结构&#xff1a; 1.1.5 删除表 查看表结构&#xf…

[网络编程]UDP协议,基于UDP协议的回显服务器

目录 1.UDP协议介绍 2.UDP协议在Java中的类 2.1DatagramSocket类 2.2DatagramPacket 3.回显服务器 3.1Sever端 3.2Client端 1.UDP协议介绍 UDP协议是一种网络协议&#xff0c;它是无连接的&#xff0c;全双工&#xff0c;并且是面向数据报&#xff0c;不可靠的一种协议…

wamp环境的组成

wamp环境介绍 简介 Wamp 就是 Windows Apache Mysql PHP集成安装环境&#xff0c;即在window下的apache、php和mysql的服务器软件。 w--windows Windows操作系统&#xff0c;是由美国微软公司&#xff08;Microsoft&#xff09;研发的操作系统&#xff0c;问世于1985年。起初…

【UE Niagara】制作传送门_Part2

在上一篇&#xff08;【UE Niagara】制作传送门_Part1&#xff09;基础上继续完成传送门的外层轮廓效果 效果 步骤 1. 打开材质“M_BasicDot_Tans”&#xff0c;添加一个“DepthFade”节点 2. 对材质“M_SubUVMaster_Additive”创建材质实例&#xff0c;这里命名为“M_Portal…

文件传输中的MD5校验技术

1. 文件的MD5校验简介 文件的MD5校验是一种常用的文件完整性验证方法。MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种广泛应用的哈希算法&#xff0c;它能够将任意长度的数据转换为固定长度的哈希值。在文件校验中&#xff0c;MD5算法通过计算文件的哈希值&…

第十四届蓝桥杯省赛PythonA/C组------翻转

题目描述&#xff1a; 小蓝用黑白棋的n个棋子排成了一行&#xff0c;他在脑海里想象出了一个长度为n的01串T&#xff0c;他发现如果把黑棋当做1&#xff0c;白棋当做0&#xff0c;这一行棋子也是一个长度为n 的01串S。 小蓝决定&#xff0c;如果在S中发现一个棋子和它两边的棋子…

常见的嵌入式面试问题解答!

1.关键字static的作用是什么&#xff1f;为什么static变量只初始化一次&#xff1f; ​1&#xff09;修饰局部变量&#xff1a;使得变量变成静态变量&#xff0c;存储在静态区&#xff0c;存储在静态区的数据周期和程序相同&#xff0c; 在main函数开始前初始化&#xff0c;在…

最新版的Tuxera NTFS 2024 支持macOS 12系统

备受期待的Tuxera NTFS 2024 Mac中文版终于上线了&#xff0c;小编第一时间为您带来&#xff01;Tuxera NTFS 2024 中文版是一款非常好用的NTFS读写工具&#xff0c;可以让您完整的读写兼容NTFS格式驱动器&#xff0c;对磁盘进行访问、编辑、存储和传输文件等。同时还包括开源磁…

C# wpf利用Clip属性实现截屏框

wpf截屏系列 第一章 使用GDI实现截屏 第二章 制作截屏框&#xff08;本章&#xff09; ______第一节 使用DockPanel制作截屏框 ______第二节 利用Clip属性实现截屏框(本节) 第三章 实现截屏框热键截屏 第四章 实现截屏框实时截屏 第五章 使用ffmpeg命令行实现录屏 文章目录 wp…

JavaScript基础之JavaScript引入方式

JavaScript引入方式 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中&#xff0c;一般以下方式: 外部方式内部方式JavaScript元素事件通过JavaScript伪URL引…

网络数据传输过程

先验知识&#xff1a;OSI模型 OSI网络模型实际上是参考模型&#xff0c;在实际中并不使用&#xff0c;在网络出现问题的时候&#xff0c;可以从一个宏观的整体去分析和解决问题&#xff0c;而且搭建网络的时候并不需要划分为7层&#xff0c;当今互联网广泛使用的是TCP/IP网络模…

js实现一个lazyman

“lazyman”通常被用来形容那些喜欢延迟处理或懒散的人&#xff0c;也就是那种不会立刻采取行动的人。 从设计模式的角度来说&#xff0c;有时也可能会用到“懒汉式”的概念&#xff0c;这通常指的是在需要的时候才进行初始化&#xff0c;比如Java中的单例模式。 此外&#x…

最短代码实现随机打乱数组各个元素的顺序

//最短代码实现随机打乱数组各个元素的顺序 randomSortArr(arr []) {return [...Array(arr.length)].map((v, i) > arr.splice(Math.round(Math.random() * (arr.length - 1)), 1)[0]); },

Unity 建造者模式(实例详解)

文章目录 说明实例1&#xff1a;构建游戏角色实例2&#xff1a;构建游戏场景实例3&#xff1a;构建UI界面 说明 在Unity中&#xff0c;建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过分离对象构建过程的复杂性&#xff0c;允许您以…

【cucumber】CucumberOptions详解

CucumberOptions注解&#xff1a;相当于Cucumber的初始化配置 Maven依赖包 <!-- 用户验收测试框架 io.cucumber.junit.CucumberOptions --><dependency><groupId>io.cucumber</groupId><artifactId>cucumber-junit</artifactId><vers…

第一节 K8S的基础概念

第一节 K8S的基础概念 Node 可以理解为一个物理机或者虚拟机 ,K8S中的一个节点 ,每个节点包含Pod 所需的服务, 这些节点 是由 Control Plane 来管理, 节点的名称 用来标识Node 对象,名称必须是唯一的. Node上有三个组件分别是 kubelet ,kube-proxy,container-runtime . kubel…

Linux命令-ab命令(Apache服务器的性能测试工具 )

Apache服务器的性能测试工具 ab命令 是一个测试你 Apache http 服务器的工具&#xff0c;你可以通过这个工具&#xff0c;指定一个单位时间内向 apache 发出的请求数量来看看你的 Apache 和机器配合的性能如何。 语法 []内容为ab命令后跟的语法&#xff0c;eg&#xff1a;ab …

MySQL索引优化:深入理解索引下推原理与实践

随着MySQL的不断发展和升级&#xff0c;每个版本都为数据库性能和查询优化带来了新的特性。在MySQL 5.6中&#xff0c;引入了一个重要的优化特性——索引下推&#xff08;Index Condition Pushdown&#xff0c;简称ICP&#xff09;。ICP能够在某些查询场景下显著提高查询性能&a…

小程序学习-20

建议每次构建npm之前都先删除miniprogram_npm