JAVA算法—排序

目录

*冒泡排序:

*选择排序:

插入排序:

快速排序:

总结:


以下全部以升序为例


*冒泡排序:

引用:

在完成升序排序时,最大的元素会经过一轮轮的遍历逐渐被交换到数列的末尾,就像气泡从水底慢慢升到水面的过程。这个过程会重复进行,直到整个序列有序,即没有更多的“气泡”需要“上浮”。

步骤(针对于升序)

  1. 从 0 索引开始向后,相邻元素两两相比(索引 0 和 1、 1 和 2 ),小的放在左,大的放在右。

如上面动图,在最大的数放置在最右边后,这样就完成了第一轮排序,这一轮中确定了最大值

  1. 在第二轮中仍然从 0 索引开始,在剩余元素中两两比较。每一轮都可以确定一个组内最大值
  2. 如果数组中有n个数据,总共我们只要执行n-1轮就可以,如针对数组{6,9,3,1}

第一轮流程:

6-9 9-3 3-1 确定了索引 3 位置上的最大值

第二轮流程:

6-9 9-3 确定了索引 2 位置上的次大值

第三轮流程:

6-9 确定了索引 1 位置上的次次大值

索引 0 显然不用再去比较,因为已经有三个数字大小关系已被确认,索引 0 就可以被默认确认。

代码演示

//1.定义数组---要求从小到大排序
int[] arr = {5, 9, 7, 3, 4};//外循环:表示我要执行多少轮。 如果有n个数据,那么执行n - 1 轮
for (int i = 0; i < arr.length-1; i++) {
//内循环表示我们在每一轮内要做什么:从 0 索引开始向后,两两比较
//-1:为了防止arr[j + 1]索引越界
//-i:提高效率,每一轮执行的次数应该比上一轮少一次。0、1、2、3for (int j = 0; j < arr.length - 1-i; j++) {if (arr[j] > arr[j + 1]) {//定义临时变量交换数据int num = arr[j];arr[j] = arr[j + 1];arr[j + 1] = num;}}
}//遍历检验
for (int i1 = 0; i1 < arr.length; i1++) {System.out.print(arr[i1] + " ");
}
}

控制台:

3 4 5 7 9


*选择排序:

引用:

步骤(针对于升序)

  1. 从0索引开始,将 0 索引跟后面的元素一 一比较

小的放左,大的放右

第一轮结束后,最小的数据已经确定,在最左侧。

  1. 所以第二轮直接从1索引开始跟后面的元素一 一比较

以此类推....

  1. 如果数组中有n个数据,总共我们只要执行n-1轮就可以如数组{2,7,5,4}

第一轮:

2-7 2-5 2-4

第二轮:

7-5 7-4

第三轮:

5 - 4

第四轮没必要走了,4 不可能和自己比较

int[] arr = {6, 4, 8, 9, 5};//外循环表示要走的轮数,
/*第一轮:6和其余四个比较  第二轮:4和其余三个比较....
......第四轮:9和5比较*/
for (int i = 0; i < arr.length - 1; i++) {
//内循环:每一轮我要干什么事情:拿着i跟i后面的数据进行比较交换for (int j = i + 1; j < arr.length; j++) {if (arr[i] > arr[j]) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}
}
//遍历检验
for (int i1 = 0; i1 < arr.length; i1++) {System.out.println(arr[i1]);
}

控制台:

4 5 6 8 9


插入排序:

和打扑克牌一样,

步骤(针对升序数组):

  1. 将 0 索引的元素到 N 索引的元素看做是有序的,其后元素则看作是无序的。

  1. 遍历后面那些无序的元素,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。
  2. 每遍历并排序完一个无序元素后,有序序列就会多一个元素,无序序列就会少一个元素。
  3. 如下引用动图:

代码实现:

int[] arr = {3, 44,38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
//显然看得出3,44有序//先找到无序序列的开始索引
int startInsert=-1;
for (int i = 0; i < arr.length; i++) {//注意这里针对的是升序if (arr[i]>arr[i+1]){startInsert=i+1;//2break;}
}//所以说无序的开始索引是2(38)
//现在遍历无序序列
for (int i =startInsert ; i <arr.length ; i++) {int j=i;//第一次为2,每轮结束后都会向后移一个//这里判断条件顺序不能变while(j>0&&arr[j]<arr[j-1]){int temp=arr[j];arr[j]=arr[j-1];arr[j-1]=temp;j--;}
}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");
}

控制台

2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

针对这段代码,解释下逻辑:

startInsert 已经知道是无序索引 2 了

i=2 进去,赋值给 j =2 ,j 用于与有序序列比较,while 括号内逻辑: j>0 并且,索引 2 的值小于和索引 1 的值,那么它们就交换位置, 然后 j--,索引 1 和索引 0 的值比较

之后 j 无发再--,此时有序序列为 2、 38、 44

跳出 while,i++,为 3,...以此类推


快速排序:

引用:

1. 从数列中挑出一个元素,一般都是左边第一个数字,称为 "基准数";

2. 创建两个指针,一个从前往后走,一个从后往前走。

3. 先执行后面的指针找出第一个比基准数小的数字

4. 再执行前面的指针找出第一个比基准数大的数字

5. 交换两个指针指向的数字

之后不断找,不断交换

6. 直到两个指针相遇

7. 将基准数跟指针指向位置的数字交换位置,称之为:基准数归位。

8. 第一轮结束之后,基准数左边的数字都是比基准数小的,基准数右边的数字都是比基准数大的。

9. 把基准数左边看做一个序列,把基准数右边看做一个序列,按照刚刚的规则递归排序


int[] arr = {6,1,2,7,9, 3, 4, 5,10, 8};quickSort(arr,0,arr.length-1);//参数:数组、排序数组开始、结束索引//遍历检验
for (int i = 0; i < arr.length; i++) {System.out.print    (arr[i]+" ");
}----------------------------------------------------
public static void quickSort(int [] arr,int i,int j){//定义两个变量记录要查找的范围int start=i;int end=j;//递归出口if (start>end){return;}//记录基准数--每轮结束后都会向后移一个int baseNumber=arr[i];//利用循环找到要交换的数字while(start!=end){//利用end,从后往前开始找,找比基准数小的数字while(true){if (end<=start||arr[end]<baseNumber){break;//end和start重合 或 找到了 就跳出循环}//否则继续向前找end--;}//利用start,从前往后找,找比基准数大的数字while(true){if (end<=start||arr[start]>baseNumber){break;//end和start重合或 找到了 就跳出循环}//否则继续向后找start++;}//把end和start指向的元素进行交换int temp=arr[start];arr[start]=arr[end];arr[end]=temp;//交换完继续循环,找下一对可交换的数,直到start=end时停止}//当start和end指向了同一个元素的时候,那么上面的循环就会结束//*start和end指向同一个元素的位置就是基准数应存入的位置*//现在就该基准数归位了
//就是拿着这个范围中的第一个数字arr[i],跟start或end指向的元素进行交换int temp=arr[i];arr[i]=arr[start];arr[start]=temp;//确定刚刚归位数左边的范围,重复刚刚所做的事情quickSort(arr,i,start-1);//确定刚刚归位数右边的范围,重复刚刚所做的事情quickSort(arr,start+1,j);
}
  • 最后是使用了递归算法
  • 最后的 基准数归位和递归算法中的 start 换成 end 也行,因为它们最后都指向了同一个位置
  • 读代码要有耐心


总结:

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

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

相关文章

项目实战——Qt实现FFmpeg音视频转码器

文章目录 前言一、移植 FFmpeg 相关文件二、绘制 ui 界面三、实现简单的转码四、功能优化1、控件布局及美化2、缩放界面3、实现拖拽4、解析文件5、开启独立线程6、开启定时器7、最终运行效果 五、附录六、资源自取 前言 本文记录使用 Qt 实现 FFmepg 音视频转码器项目的开发过…

Kubernetes/k8s之HPA,命名空间资源限制

Horizontal Pod Autoscaling:po的水平自动伸缩 这是k8s自带的模块 pod占用cpu比例达到一定的阀值&#xff0c;会触发伸缩机制。 根据cpu的阀值触发伸缩机制 replication controller 副本控制器 控制pod的副本数 deployment controller 节点控制器 部署pod hpa控制副本的数…

深度学习(3)--递归神经网络(RNN)和词向量模型Word2Vec

目录 一.递归神经网络基础概念 二.自然语言处理-词向量模型Word2Vec 2.1.词向量模型 2.2.常用模型对比 2.3.负采样方案 2.4.词向量训练过程 一.递归神经网络基础概念 递归神经网络(Recursive Neural Network, RNN)可以解决有时间序列的问题&#xff0c;处理诸如树、图这样…

蓝桥杯(C++ 最大开支 优先队列)

优先队列&#xff1a; 蓝桥杯&#xff08;C 整数删除 优先队列 &#xff09;-CSDN博客 思路&#xff1a; 1、每个人依此选择项目&#xff0c;每个人选项目时都&#xff08;选择当下花费增加最多的项目&#xff09;&#xff0c;若项目i的门票价格为kxb&#xff0c;那么增加一个…

HTML+JavaScript-02

数组 JavaScript中的数组用于在单一变量存储多个值&#xff0c;其实跟java中的数组是一样的&#xff0c;都是通过索引来访问这些值的。 创建数组 方式一&#xff1a;&#xff08;推荐&#xff09; var cars ["北京现代", "丰田", "五菱宏光"…

EDA-数据探索-pandas自带可视化-iris

# 加载yellowbrick数据集 import os import pandas as pd FIXTURES os.path.join(os.getcwd(), "data") df pd.read_csv(os.path.join(FIXTURES,"iris.csv")) df.head()sepal_lengthsepal_widthpetal_lengthpetal_widthspecies05.13.51.40.2setosa14.93…

最新AI系统ChatGPT网站系统源码,支持AI绘画,GPT语音对话,ChatFile文档对话总结,DALL-E3文生图,MJ绘画局部编辑重绘

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

数仓建设学习路线(三)元数据管理

什么是元数据&#xff1f; 简单来说就是描述数据的数据&#xff0c;更直白来说就是描述表名、表制作者、表字段、表生命周期、表存粗等信息的数据 元数据该如何管理 工具化 开源&#xff1a; 可通过atlas获取表依赖及信息做二次开发&#xff0c;或者完成可视化界面 平台化&am…

【网络安全 -> 防御与保护】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 网络安全——防御与保护 &#xff08;一&#xff09;.信息安全概述 &#xff08;二&#xff09;.防火墙组网

计组与原理:系统总线

大家好啊&#xff0c;这里来到计组第二部分内容&#xff1a;系统总线 跳转上一篇&#xff1a;计组原理&#xff1a;系统概论与基本组成 系统总线 1.总线的基本概念单总线结构框图面向 CPU 的双总线结构框图以存储器为中心的双总线结构框图 2.总线的分类片内总线系统总线通信总线…

Linux之权限(内容详细,细节满满)

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力 目录 一.前言 二.权限修改的两种方法 …

Python学习02—Python开发环境的配置

1.Python语言的简单概述 Python的诞生离不开一个人&#xff0c;他就是Guido van Rossum&#xff0c;他在1989年的圣诞节期间&#xff0c;在荷兰的阿姆斯特丹度假&#xff0c;为了打发假期时间&#xff0c;就想着设计一种编程语言&#xff0c;后期便诞生了Python Python语言拥…

掌握技术脉搏:程序员如何在技术变革中保持领先,避免被裁员

笔者刚入行IT业的时候&#xff0c;有个前辈老猿工就语重心长的说&#xff0c;写代码要与时俱进&#xff0c;永远不能停止学习&#xff0c;如果不能时刻走在前面&#xff0c;就会被淘汰。哪天感觉到力不从心&#xff0c;就要考虑努力往管理层走啦。随着计算机技术和互联网技术的…

MySQL-B-tree和B+tree区别

B-tree&#xff08;平衡树&#xff09;和Btree&#xff08;平衡树的一种变种&#xff09;是两种常见的树状数据结构&#xff0c;用于构建索引以提高数据库的查询性能。它们在一些方面有相似之处&#xff0c;但也有一些关键的区别。以下是B-tree和Btree的主要区别&#xff1a; …

Java Server-Sent Events通信

Server-Sent Events特点与优势 后端可以向前端发送信息&#xff0c;类似于websocket&#xff0c;但是websocket是双向通信&#xff0c;但是sse为单向通信&#xff0c;服务器只能向客户端发送文本信息&#xff0c;效率比websocket高。 单向通信&#xff1a;SSE只支持服务器到客…

Leetcode—22.括号生成【中等】

2023每日刷题&#xff08;七十九&#xff09; Leetcode—22.括号生成 算法思想 实现代码 class Solution { public:vector<string> generateParenthesis(int n) {vector<string> ans;int m n * 2;string path(m, 0);function<void(int, int)> dfs [&…

小红书多模态团队建立新「扩散模型」:解码脑电波,高清还原人眼所见

近些年&#xff0c;研究人员们对探索大脑如何解读视觉信息&#xff0c;并试图还原出原始图像一直孜孜不倦。去年一篇被 CVPR 录用的论文&#xff0c;通过扩散模型重建视觉影像&#xff0c;给出了非常炸裂的效果—— AI 不光通过脑电波知道你看到了什么&#xff0c;并且帮你画了…

技术浪潮中的职业变革:程序员面临的裁员挑战与应对策略

目录 前言 冲破时空壁垒&#xff1a;探索技术变革的酷时代&#xff01; 逆境成长&#xff1a;一个互联网人战胜失业困境的故事 裁员的双面影响&#xff1a;挑战与机遇 应对裁员潮危机&#xff1a;程序员的超级英雄之路 前言 惊人的新闻传来&#xff0c;一对来自中国的工程师…

基于神经网络的电力系统的负荷预测

一、背景介绍&#xff1a; 电力系统负荷预测是生产部门的重要工作之一&#xff0c;通过准确的负荷预测&#xff0c;可以经济合理地安排机组的启停、减少旋转备用容量、合理安排检修计划、降低发电成本和提高经济效益。负荷预测按预测的时间可以分为长期、中期和短期负荷预测。…

​​快速排序(四)——挖坑法,前后指针法与非递归

目录 ​一.前言 二.挖坑法 三.前后指针法 四.递归优化 五.非递归 六.结语 一.前言 本文我们接着上篇文章的重点快排&#xff0c;现在继续讲解对快排优化的挖坑法&#xff0c;前后指针法以及非递归方法&#xff0c;下面是上篇文章快排链接&#xff1a;https://mp.csdn.net…