四大常见的排序算法JAVA

1. 冒泡排序

  1. 相邻的元素两两比较,大的放右边,小的放左边

  2. 第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面以此类推

  3. 如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以

 

 

package Bubble;/*冒泡排序:核心思想:1,相邻的元素两两比较,大的放右边,小的放左边。2,第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面以此类推。3,如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以。*/
public class demo1 {public static void main(String[] args) {//1.定义数组int[] arr = {2, 4, 5, 3, 1};//2.利用冒泡排序将数组中的数据变成 1 2 3 4 5int[] newArr = bubble_sort(arr);for (int i = 0; i < newArr.length; i++) {System.out.print(newArr[i] + " ");}}private static int[] bubble_sort(int[] arr) {//外循环: 表示我要执行多少论,如果有n个数据,那么执行n-1论for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {//内循环:每一轮中我如何比较数据并且找到当前的最大值//-1:为了防止索引越界//-i:提高效率,每一轮执行的次数应该比上一轮少一次if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}return arr;}
}

 

2.选择排序

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

  2. 小的放前面,大的放后面

  3. 第一次循环结束后,最小的数据已经确定

  4. 第二次循环从1索引开始以此类推

  5. 第三轮循环从2索引开始以此类推

  6. 第四轮循环从3索引开始以此类推。

 

 

 

        

package Bubble;
//选择排序
public class demo2 {public static void main(String[] args) {int[] arr = {4, 32, 1, 5, 6};//外循环:几轮//i表示这一轮当中,我拿着哪个的索引上的数据跟后面的数据进行交换for (int i = 0; i < arr.length - 1; i++) {for (int j = i + 1; j < arr.length; j++) {//内循环:每一轮拿着i跟i后面的数据进行比较交换if (arr[i] > arr[j]) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

3.插入排序

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过创建有序序列和无序序列,然后再遍历无序序列得到里面每一个数字,把每一个数字插入到有序序列中正确的位置。

插入排序在插入的时候,有优化算法,在遍历有序序列找正确位置时,可以采取二分查找

将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。

遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。

N的范围:0~最大索引

package Bubble;/*插入排序:将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。N的范围:0~最大索引*/
public class demo3 {public static void main(String[] args) {int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};//1.找到无序的哪一组数组是从哪个索引开始的。  2int startIndex = -1;for (int i = 0; i < arr.length; i++) {if (arr[i] > arr[i + 1]) {startIndex = i + 1;break;}}//2.遍历从startIndex开始到最后一个元素,依次得到无序的哪一组数据中的每一个元素for (int i = startIndex; i < arr.length; i++) {//记录当前要插入数据的索引int j = i;while (j > 0 && arr[j] < arr[j - 1]) {//j>0: 和前一个元素比较索引必须大于0//交换int tmp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = tmp;j--;}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

 

递归算法

package dg;public class demo1 {public static void main(String[] args) {//利用递归球1-100之间的和int sum = getSum(100);System.out.println(sum);}//大问题拆解小问题//1~100之间的和=100+(1~99之间的和)//1~99之间的和=99+(1~98之间的和)//1~98之间的和=98+(1~97之间的和)//....//1~2之间的和=2+(1~1之间的和)//1~1之间的和就是1public static int getSum(int num){if(num==1)return 1;else{return num+getSum(num-1);}}}

package dg;public class demo2 {public static void main(String[] args) {//递归求5的阶乘int factorial = getFactorial(5);System.out.println(factorial);}public static int getFactorial(int n) {//5!=5*4*3*2*1//5!=5*4!//4!=4*3!//3!=3*2!//2!=2*1!//1!=1if (n == 1) {return 1;} else {return n * getFactorial(n - 1);}}
}

4. 快速排序

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

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

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

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

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

  6. 直到两个指针相遇

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

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

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

① 

首先把0索引当做基准数,如图6为基准数,确定左下标start,右下标end,start下标是找比基准数大的数,

end是找比基准数小的数 ,先找end,找到了1停下,然后找start的数,找到停下并且交换,一直start++,end--,直到start和end指向同一根数   ,如下图

那么指向同一个数的下标就是基准数要存入的位置,也就是基准数要放入的地方

专业名称:基准数归位,基准数左边的都比基准数小,右边的都比基准数大

 

找到第一个基准数以后,然后利用这个基准数分为二边,然后左边利用第一个索引3为基准数在左边进行排序,在利用9在右边排序

package Bubble;/*快速排序:第一轮:以0索引的数字为基准数,确定基准数在数组中正确的位置。比基准数小的全部在左边,比基准数大的全部在右边。后面以此类推。*/
public class demo4 {public static void main(String[] args) {int[] arr = {6, 2, 7, 9, 3, 4, 5, 1, 10, 8};qsort(arr, 0, arr.length - 1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}/**   参数一:我们要排序的数组*   参数二:要排序数组的起始索引*   参数三:要排序数组的结束索引* */public static void qsort(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,前往后走,找到基准数大的就停下while (true) {if (end <= start || arr[start] > baseNumber) {break;}start++;}//交换end和start所指向的数int tmp = arr[start];arr[start] = arr[end];arr[end] = tmp;}//当start和end指向了同一个元素的时候,那么上面的循环就会结束//表示已经找到了基准数在数组中应存入的位置//基准数归位//就是拿着这个范围中的第一个数字,跟start指向的元素进行交换int tmp = arr[i];arr[i] = arr[start];arr[start] = tmp;//确定6左边的范围,重复刚刚所做的事情qsort(arr, i, start - 1);//确定6右边的范围,重复刚刚所做的事情qsort(arr,start + 1,j);}
}

总结

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

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

相关文章

基于CentOS Stream 9平台搭建MinIO以及开机自启

1. 官网 https://min.io/download?licenseagpl&platformlinux 1.1 下载二进制包 指定目录下载 cd /opt/coisini/ wget https://dl.min.io/server/minio/release/linux-amd64/minio1.2 文件赋权 chmod x /opt/coisini/minio1.3 创建Minio存储数据目录&#xff1a; mkdi…

Ubuntu + SSH密钥连接服务器

1. 下载VS code cd到下载文件夹后&#xff0c;使用命令安装&#xff0c;把xxx复制为文件名 sudo dpkg -i xxx.deb2. 为VSCode换皮肤 3. 下载SSH插件和Docker插件 4. 配置SSH 把密钥key文件放在/home/your_user_name/.ssh/里面&#xff0c;然后在/home/your_user_name/.ssh/c…

昇思25天学习打卡营第7天|深度学习流程全解析:从模型训练到评估

目录 构建数据集 定义神经网络模型 定义超参、损失函数和优化器 超参 损失函数 优化器 训练与评估 构建数据集 首先从数据集 Dataset加载代码&#xff0c;构建数据集。 代码如下&#xff1a; #引入了必要的库和模块&#xff0c;像 mindspore 以及相关的数据处理模块等等。…

使用WinSCP工具连接Windows电脑与Ubuntu虚拟机实现文件共享传输

一。环境配置 1.首先你的Windows电脑上安装了VMware虚拟机&#xff0c;虚拟机装有Ubuntu系统&#xff1b; 2.在你的windows电脑安装了WinSCP工具&#xff1b; 3.打开WinSCP工具默认是这样 二。设置WinSCP连接 打开WinSCP&#xff0c;点击新标签页&#xff0c;进入到如下图的…

【持续集成_03课_Jenkins生成Allure报告及Sonar静态扫描】

1、 一、构建之后的配置 1、安装allure插件 安装好之后&#xff0c;可以在这里搜到已经安装的 2、配置allure的allure-commandline 正常配置&#xff0c;是要么在工具里配置&#xff0c;要么在系统里配置 allure-commandline是在工具里进行配置 两种方式进行配置 1&#xff…

关闭vue3中脑瘫的ESLine

在创建vue3的时候脑子一抽选了ESLine,然后这傻卵子ESLine老是给我报错 博主用的idea开发前端 ,纯粹是用不惯vscode 关闭idea中的ESLine,这个只是取消红色波浪线, 界面中的显示 第二步,在vue.config.js中添加 lintOnSave: false 到这里就ok了,其他的我试过了一点用没有

STM32-ADC+DMA

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. ADC模拟-数字转换器1.1 ADC模拟-数字转换器1.2 逐次逼近型ADC1.3 ADC框图1.4 ADC基本结构1.5 输入通道1.6 规则组的转换模式1.6.1 单次转换&#xff0c;非扫描模式1.6.2 连续转换&#xff0c;非扫描模式1.6.3 单次…

Python28-7.4 独立成分分析ICA分离混合音频

独立成分分析&#xff08;Independent Component Analysis&#xff0c;ICA&#xff09;是一种统计与计算技术&#xff0c;主要用于信号分离&#xff0c;即从多种混合信号中提取出独立的信号源。ICA在处理盲源分离&#xff08;Blind Source Separation&#xff0c;BSS&#xff0…

Spring源码十七:Bean实例化入口探索

上一篇Spring源码十六&#xff1a;Bean名称转化我们讨论doGetBean的第一个方法transformedBeanName方法&#xff0c;了解Spring是如何处理特殊的beanName&#xff08;带&符号前缀&#xff09;与Spring的别名机制。今天我们继续往方法下面看&#xff1a; doGetBean 这个方法…

按键控制LED流水灯模式定时器时钟

目录 1.定时器 2. STC89C52定时器资源 3.定时器框图 4. 定时器工作模式 5.中断系统 1&#xff09;介绍 2&#xff09;流程图&#xff1a;​编辑 3&#xff09;STC89C52中断资源 4&#xff09;定时器和中断系统 5&#xff09;定时器的相关寄存器 6.按键控制LED流水灯模…

对话大模型Prompt是否需要礼貌点?

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的QA数据集构建&#xff08;附代码&#xff09;Qwen-2-7B和GLM-4-9B&#x…

【机器学习】机器学习与时间序列分析的融合应用与性能优化新探索

文章目录 引言第一章&#xff1a;机器学习在时间序列分析中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 数据增强 1.2 模型选择1.2.1 自回归模型1.2.2 移动平均模型1.2.3 长短期记忆网络1.2.4 卷积神经网络 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 A…

平台稳定性里程碑 | Android 15 Beta 3 已发布

作者 / 产品管理副总裁、Android 开发者 Matthew McCullough 从近期发布的 Beta 3 开始&#xff0c;Android 15 达成了平台稳定性里程碑版本&#xff0c;这意味着开发者 API 和所有面向应用的行为都已是最终版本&#xff0c;您可以查阅它们并将其集成到您的应用中&#xff0c;并…

Pandas 入门 15 题

Pandas 入门 15 题 1. 相关知识点1.1 修改DataFrame列名1.2 获取行列数1.3 显示前n行1.4 条件数据选取值1.5 创建新列1.6 删去重复的行1.7 删除空值的数据1.9 修改列名1.10 修改数据类型1.11 填充缺失值1.12 数据上下合并1.13 pivot_table透视表的使用1.14 melt透视表的使用1.1…

使用Vue实现前后端分离 spring框架返回json数据中文乱码

java json数据返回值中文乱码 出现&#xff1f;&#xff1f;&#xff1f; - _xkoko - 博客园 (cnblogs.com) 引入js的script标签到底是放在head还是body中_html页面中用<script>标签引入js代码,该标签放在<head>标签中和放在<body>标签-CSDN博客 vue.js 的问…

golang结合neo4j实现权限功能设计

neo4j 是非关系型数据库之图形数据库&#xff0c;这里不再赘述。 传统关系数据库基于rbac实现权限, user ---- role ------permission,加上中间表共5张表。 如果再添上部门的概念&#xff1a;用户属于部门&#xff0c;部门拥有 角色&#xff0c;则又多了一层&#xff1a; user-…

MySQL之备份与恢复(七)

备份与恢复 文件系统快照 规划LVM备份 LVM快照备份也是有开销的。服务器写到原始卷的越多&#xff0c;引发的额外开销也越多。当服务器随机修改许多不同块时&#xff0c;磁头需要需要自写时复制空间来来回回寻址&#xff0c;并且将数据的老版本写到写时复制空间。从快照中读…

网络基础:IS-IS协议

IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;是一种链路状态路由协议&#xff0c;最初由 ISO&#xff08;International Organization for Standardization&#xff09;为 CLNS&#xff08;Connectionless Network Service&#xff09;网络设计。…

Windows电脑下载、安装VS Code的方法

本文介绍Visual Studio Code&#xff08;VS Code&#xff09;软件在Windows操作系统电脑中的下载、安装、运行方法。 Visual Studio Code&#xff08;简称VS Code&#xff09;是一款由微软开发的免费、开源的源代码编辑器&#xff0c;支持跨平台使用&#xff0c;可在Windows、m…

apk反编译修改教程系列-----修改apk 解除软件限制功能 实例操作步骤解析_3【二十二】

在前面的几期博文中有过解析去除apk中功能权限的反编译步骤。另外在以往博文中也列举了修改apk中选项功能权限的操作方法。今天以另外一款apk作为演示修改反编译去除软件功能限制的步骤。兴趣的友友可以参考其中的修改过程。 课程的目的是了解apk中各个文件的具体作用以及简单…