排序算法,冒泡排序算法及优化,选择排序SelectionSort,快速排序(递归-分区)

一、冒泡排序算法:

介绍:

        冒泡排序(Bubble Sort)是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

        作为最简单的排序算法之一,冒泡排序给我们的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。

原理:

        排序的趟数len-1,每趟将数组的中的进行两两比较,若前者值比后者值大(小),发生索引元素交换,每遍历一次,最后一位产生一个最大(小)值; 

代码:

/*** 冒泡排序算法+优化* @param arr 数组* @param type 升序:asc 降序:desc*/
public void sort(int[] arr,String type){
// 原理:排序的趟数len-1,每趟将数组的中的进行两两比较,若前者值比后者值大(小),发生索引元素交换,每遍历一次,最后一位产生一个最大(小)值; System.out.println("原数组:"+Arrays.toString(arr));boolean flag = false; // 用来判断是否有交换,无交换说明已经排好序,不需要再排;默认无交换;for (int i = 0; i < arr.length - 1; i++) {  // 执行多少轮    数组长度-1flag = false; // 每次循环之后,重置默认无交换for (int j = 0; j < arr.length - i - 1; j++) { // 每论执行多少次比较  数组长度-i-1if(type.equals("desc")){    // 降序排序if(arr[j] < arr[j+1]){  // 两数比较:前数小交换int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;flag = true;}}else{ // 升序排序if(arr[j] > arr[j+1]){  // 两数比较:前数大交换int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;flag = true;}}}System.out.println("第"+(i+1)+"排序:"+Arrays.toString(arr));if(!flag){  // 如果当前轮没有发生两数之间的交换,说明顺序已经排好,结束循环break;}}
}

二、选择排序SelectionSort

介绍:

        选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

原理:

int[] ints = {6, 1, 4, 5, 2, 3};/** 第一轮: 下标为0的元素作为最小的, 下标0和下标1(下标为最小), 下标1和下标2, 下标1和下标3, 下标1和下标4, 下标1和下标5   5次*         1 6 4 5 2 3* 第二轮: 下标为1的元素作为最小的, 下标1和下标2(下标2位最小), 下标2和下标3, 下标2和下标4(下标4位最小), 下标4和下标5   4次*         1 2 4 5 6 3* 第三轮: 下标为2的元素作为最小的, 下标2和下标3, 下标2和下标4, 下标2和下标5(下标5最小)  3次*         1 2 3 5 6 4* 第四轮: 下标为3的元素作为最小的, 下标3和下标4, 下标3和下标5(下标5最下) 2次*         1 2 3 4 6 5* 第五轮: 下标为4的元素作为最小的, 下标4和下标5(下标5最小) 1次*         1 2 3 4 5 6* */

代码:

/*** 选择排序-升序* @param arr 要排序的数组*/
public static void selectionSortAscendingOrder(int[] arr){// 原理:比较len-1趟;假设第n(从0开始)个位置的值为最小值,依次与后面的值比较,若前者数大于后者数,记录后者元素对应的索引;一趟之后,将两个索引位置元素进行交换// 需要循环的趟数,比较数组长度-1趟,例如:数组长度6,需要遍历5趟,依次找到五个最小值for (int i = 1; i < arr.length; i++) {int minIndex = i-1;// 记录:最小元素索引位置// 每趟需要比较的次数;for (int j = i; j < arr.length; j++) {//第一个索引位置的值依次与后面元素比较,若前者的值大于后者值,那么最小值的索引为后者元素的索引if(arr[minIndex] > arr[j]){minIndex = j;}}// 判断最小元素是否是自己,若不是自己再发生交换if(minIndex != i-1){ // 算数运算符的优先级高于比较运算符// 获取第一个位置的元素int temp = arr[i-1];// 获取最小索引位置的元素arr[i-1] = arr[minIndex];// 将两处索引位置的值交换arr[minIndex] = temp;}}

三、快速排序

介绍:

        快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

        快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

        快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。

原理(步骤):

        1. 从数列中挑出一个元素,称为 "基准"(pivot);

        2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

        3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

代码:

/*** 快速排序: 原理:以左边索引位0的数为基准,*                  先从右边开始找,直到找到比基准数小的为止(左边索引小于右边索引);*                  再从左边开始找直到找到比索引值大的为止(左边索引小于右边索引);*                  交换两处索引位置的值;*                  如果左边索引与右边索引相同,那么基准值与索引相同处元素替换使用递归依次处理*          左分区递归递归*          右分区递归递归*          判断递归出口* @param arr* @param left* @param right*/
public static void quickSort(int[] arr, int left, int right) {// 使用递归时的出口if(left >= right){return;}int i = left + 1;// left+1 表示从基准值下一位开始int j = right;// 基准元素(pivot Element)int baseElement = arr[left];// 循环交换数组中 比基准值大的 与 比基准值小的 交换while (i != j) {// 先从右边开始找, 如果找到比基准值小的 结束查找,并且左边索引要小于右边索引while (arr[j] > baseElement && i < j) {j--;}// 再从左边开始找,如果找到比基准值大的 结束查找,并且左边索引要小于右边索引while (arr[i] < baseElement && i < j){i++;}// 如果找到了左边找到了比基准值小的,右边找到了比基准值大的,两元素发生交换if(j != i){ // 如果两个索引相同就不需要交换了结束循环int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 左边索引与右边索引指向同一位置说明找到了,该基准值的位置;将基准值与索引位置值发生交换arr[left] = arr[i];arr[i] = baseElement;// 左分区递归调用排序quickSort(arr,left,i-1);// 右分区递归调用排序quickSort(arr,i+1,right);
}

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

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

相关文章

关于SparkRdd和SparkSql的几个指标统计,scala语言,打包上传到spark集群,yarn模式运行

需求&#xff1a; ❖ 要求:分别用SparkRDD, SparkSQL两种编程方式完成下列数据分析,结合webUI监控比较性能优劣并给出结果的合理化解释. 1、分别统计用户&#xff0c;性别&#xff0c;职业的个数&#xff1a; 2、查看统计年龄分布情况&#xff08;按照年龄分段为7段&#xff0…

初识树结构和二叉树

一&#xff0c;树概念及结构 1.1树结构的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 注意&a…

AI全栈大模型工程师(九)Function Calling 的机制

文章目录 Function Calling 的机制Function Calling 示例 1:加法计算器Function Calling 实例 2:四则混合运算计算器后记Function Calling 的机制 Function Calling 示例 1:加法计算器 需求:用户输入任意可以用加法解决的问题,都能得到计算结果。 # 加载环境变量import o…

人工智能发展与结构科学

人工智能&#xff08;AI&#xff09;在各种应用中的影响力不断增强&#xff0c;从简单的计算任务到复杂的决策支持。但在这背后&#xff0c;AI的发展其实是一个关于结构演变的故事。从最早的线性结构&#xff0c;到今天的复杂网络结构&#xff0c;结构的演变对AI的能力和效率产…

【linux】查看下载应用在服务器的日志

查看日志路径 一般在配置文件中logback.xml 账号密码xshell连接服务器&#xff0c;进入日志路径 根据搜索关键字查看xxx.log文件内容 cat xxx.log | grep 关键字 下载 xxx.log 到本地&#xff0c;一般可以下载当天的日志文件到本地查看比较方便 sz xxx.log 参考文章&#xff…

Adobe 推出 Photoshop Elements 2024 新版

&#x1f989; AI新闻 &#x1f680; Adobe 推出 Photoshop Elements 2024 新版 摘要:Adobe 最新发布 Photoshop Elements 2024 版本,新增引入 AI 功能,提供匹配颜色、创建照片卷、一键选择照片天空或背景等新功能,界面也进行了优化更新。本次发布重点加强了 AI 支持,简化复杂…

【软考-中级】系统集成项目管理工程师 【19 项目收尾管理】

持续更新。。。。。。。。。。。。。。。 【第十九章】收尾管理 &#xff08;选择题1分&#xff09; 19.1 项目验收19.2 项目总结19.3系统维护19.3.1软件项目的后续工作19.3.2系统集成项目的后续工作 19.4 项目后评价1. 信息系统目标评价2. 信息系统过程评价3. 信息系统效益评价…

嵌入式学习笔记(60)内存管理之堆

1.7.1.什么是堆&#xff08;heap&#xff09; 内存管理对OS来说是一件非常复杂的事&#xff0c;因为首先内存容量大&#xff0c;其次内存需求在时间和大小块上没有规律&#xff08;OS上运行着几十、几百、几千个进程随时都会申请或者释放内存&#xff0c;申请或者释放的内存块…

leetcode:2678. 老人的数目(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的字符串 details 。details 中每个元素都是一位乘客的信息&#xff0c;信息用长度为 15 的字符串表示&#xff0c;表示方式如下&#xff1a; 前十个字符是乘客的手机号码。接下来的一个字符是乘客的性别。接下来两个字符是乘客的年…

100天掌握网络安全知识点!

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

Microsoft Edge中使用开源的ChatGPT

一、双击打开浏览器 找到&#xff1a;扩展&#xff0c;打开 二、打开Microsoft Edge加载项 三、Move tab新标签 获取免费ChatGPT 四、启用Move tab。启用ChatGPT。 扩展 管理扩展 启用 五、新建标签页&#xff0c;使用GPT 六、使用举例 提问 GPT回复

学习git博客

git新建分支并且提交代码过程 1. git pull <codeBaseAddress> [分支名(默认是master)] 2. cd <projectName> 3. git branch <newBranchName> // 创建分支 4. git checkout <newBranchName> // 切换到新分支 // 开始写你的新代码 5. git add . //…

idea2023配置maven

看过【黑马程序员Maven全套教程&#xff0c;maven项目管理从基础到高级&#xff0c;Java项目开发必会管理工具maven】https://www.bilibili.com/video/BV1Ah411S7ZE?p9&vd_sourceedf9d91e5a0a27db51e3d6d4b9400637 配置的&#xff0c;前提要素配置也在这个课程里有啦&…

linux 下的java gate服务断掉的原因及解决思路

一.查询断掉的原因 1.查看gate日志&#xff0c;发现没有报错信息&#xff0c;突然就断了 2.查看是不是OOM导致 dmesg | grep java 发现确实Out of Memory了 3.发生问题的原因&#xff1a; 默认情况下, Linux kernels(内核)允许进程申请的量超过系统可用内存. 这是因为,在大多数…

微机原理:汇编语言语句类型与格式

文章目录 壹、语句类型1、语句分类2、常用伪代码和运算符2.1数据定义伪指令2.1.1字节定义伪指令DB&#xff08;8位&#xff09;2.1.2字定义伪指令DW&#xff08;16位&#xff09;2.1.3双字节伪指令DD2.1.4 多字节定义DF/DQ/DT&#xff08;了解&#xff09; 2.2 常用运算符2.2.1…

SLAM从入门到精通(a*搜路算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前机器人常用的搜路算法主要有这么几种&#xff0c;迪杰斯特拉算法、a*算法、贪心算法。每一种算法都有自己的场景和优势&#xff0c;可以灵活选…

工业电子中的深力科分享一款PWM控制器 KA3525A

关于PWM控制器&#xff1a; PWM控制器是一种用于控制电机或其他设备的电路&#xff0c;它通过改变脉冲宽度调制&#xff08;PWM&#xff09;信号的占空比来控制设备的输出。PWM控制器可以使用单片机或开发板等设备来实现&#xff0c;通过设定占空比&#xff0c;可以轻松地控制…

DOS常用命令

1. echo off bat脚本中&#xff0c;该命令可以认为屏蔽掉cmd窗口的盘符 加命令前 加 echo off 之后 2. pause 程序运行完成之后cmd窗口不关闭&#xff0c; 一般程序都是在 1和2之间

堆排序;大顶堆、小顶堆

堆排序 基本介绍 堆排序基本思想 堆排序步骤图解 在第二个步骤中&#xff0c;将节点6和它的两个左右节点比较大小&#xff0c;发现右节点最大&#xff0c;所以将节点6和节点9进行交换&#xff0c;如图所示&#xff0c;数组相应位置的值也交换 总结 代码实现 """…

短视频矩阵系统源头开发

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