当前位置: 首页 > news >正文

排序算法,冒泡排序算法及优化,选择排序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);
}

相关文章:

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

一、冒泡排序算法&#xff1a; 介绍&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需…...

编写内联函数求解 2x²+4x+5的值,并用主函数调用该函数

动态内存分配可以根据实际需要在程序运行过程中动态地申请内存空间,这种内存空间的分配和释放是由程序员自己管理的,因此也被称为手动内存分配。 C++ 中,动态内存的分配和释放是通过 new 和 delete 操作符进行的。new 操作符用于在堆内存上为对象动态分配空间,dele…...

【Release】Photoshop ICO file format plug-in 3.0

【Introduction】 The Photoshop ICO plug-in is a file format plug-in developed for Photoshop, which allows Photoshop to directly read and write ICO format files. Because Photoshop has powerful pixel bitmap editing functions, it has many users and a good us…...

List.of() Vs Arrays.asList()

java中list.of和Arrays.asList方法有什么区别&#xff1f; 简介 Java 提供了几种用于创建列表的方便方法&#xff0c;包括 List.of 和 Arrays.aslist。尽管这两种方法都可以很简单的创建集合对象&#xff0c;但它们实际上是有一些显著差异的。本文将介绍 Java 中的 List.of()…...

机器学习-计算数据之间的距离

目录 欧氏距离 欧氏距离应用场景&#xff1a; 聚类分析&#xff1a;在聚类算法中(K-means)中&#xff0c;可以使用欧式距离来衡量数据点之间的相似性或距离&#xff0c;以便于将他们划分到不用的簇中。特征匹配&#xff1a;在计算机视觉和图像处理中&#xff0c;可以使用欧氏…...

Uniapp软件库源码 全新带勋章功能(包含前后端源码)

Uniapp软件库全新带勋章功能&#xff0c;搭建好后台 在前端找到 util 这个文件 把两个js文件上面的填上自己的域名&#xff0c; 电脑需要下载&#xff1a;HBuilderX 登录账号 没有账号就注册账号&#xff0c;然后上传文件&#xff0c;打包选择 “发行” 可以打包app h5等等。…...

陪诊小程序|陪诊小程序关爱健康,无忧陪伴

随着社会发展和人们生活水平的提高&#xff0c;健康问题成为人们关注的焦点。然而&#xff0c;在就医过程中&#xff0c;许多患者常常感到孤独和无助&#xff0c;缺乏得到家人陪伴的温暖与安慰。为了解决这一问题&#xff0c;我们公司开发了一款创新的陪诊小程序软件&#xff0…...

uni-app小程序使用DCloud(插件市场)流程

一、DCloud&#xff08;插件市场&#xff09; DCloud 是uni-app官方插件市场&#xff0c;里面有官方、团队、个人发布的众多插件&#xff0c;包括uni-ui、uni-pay 等。而像uni-ui这种大型组件库都有官方文档可参考&#xff0c;但一些团队或个人发布的小型插件没有文档&#xf…...

非平稳信号分析和处理、STFT的瞬时频率研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

SIPp使用经验

xml文件&#xff0c;建议<?xml version"1.0" encoding"UTF-8" ?>&#xff0c;不建议ISO-8859-1命令行传key参数 sipp -key contact_port 9999 ...<send retrans"500"><![CDATA[REGISTER sip:[field1]:[remote_port] SIP/2.0Vi…...

ChessGPT:免费好用的国际象棋对弈AI机器人

对于国际象棋初学者&#xff0c;需要找一个对手来练棋。ChessGPT&#xff0c;就是一个免费好用的AI对弈机器人&#xff0c;非常适合新手来提升&#xff0c;是一个很好的练习伙伴。网站地址是&#xff1a;https://www.chess.com/play/computer&#xff0c;也有手机版app&#xf…...

华为OD 区间交集(200分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

Python算法:八大排序算法以及速度比较

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…...

半导体用超高纯管材行业头部企业市场占有率及排名调研报告

内容摘要 本文调研和分析全球半导体用超高纯管材发展现状及未来趋势&#xff0c;核心内容如下&#xff1a; &#xff08;1&#xff09;全球市场总体规模&#xff0c;分别按销量和按收入进行了统计分析&#xff0c;历史数据2018-2022年&#xff0c;预测数据2023至2029年。 &…...

Qt中的线程同步:确保多线程程序的安全性

在现代计算机编程中,多线程编程已经变得非常常见,因为它可以提高程序的性能和响应能力。然而,多线程编程也引入了许多挑战,其中一个主要挑战是线程同步。线程同步是确保多个线程协同工作时数据的安全性和一致性的关键问题。Qt作为一种流行的C++框架,提供了丰富的工具和类来…...

ESRI ArcGIS Desktop 10.8.2图文安装教程及下载

ArcGIS 是由美国著名的地理信息系统公司 Esri 开发的一款地理信息系统软件&#xff0c;它是目前全球最流行的 GIS 软件之一。ArcGIS 提供了图形化用户界面和数据分析工具&#xff0c;可以帮助用户管理、分析和可视化各种空间数据。ArcGIS Desktop是一个完整的桌面GIS软件套件&a…...

笔记本电脑Windows10安装

0 前提 安装windows10的电脑为老版联想笔记本电脑&#xff0c;内部没有硬盘&#xff0c;临时加装了1T的硬盘。 1u盘准备 准备u盘&#xff0c;大小大于16G。u盘作为系统盘时&#xff0c;需要将内部的其他文件备份&#xff0c;然后格式化。u盘格式化后&#xff0c;插入一款可以…...

跨域方案的抉择

前言 遇到跨域问题的时候&#xff0c;到底是使用CORS来解决&#xff0c;还是使用代理呢&#xff1f; 判断依据不是技术层面&#xff0c;而是你的生产环境。 首先要关注的是生产环境里面到底是一种什么样的情况&#xff0c;到底有没有跨域&#xff0c;然后根据生产环境的情况&a…...

接口测试(jmeter和postman 接口使用)

接口测试基础知识 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。把前端&#xff08;client&#xff09;和后端&#xff08;server&#xff09;联系起来&#xff0c;测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系…...

doc与docx文档转html,格式样式不变(包含图片转换)

最近做一个富文本的需求&#xff0c;要求把文档内容转换到富文本内&#xff0c;文档中的格式也好&#xff0c;样式也好&#xff0c;图片啥的都要一致展示&#xff1b;踩了不少坑&#xff0c;据说word文档其实是一个压缩包&#xff0c;我不是特别清楚但是也能理解&#xff0c;自…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...

C/Python/Go示例 | Socket Programing与RPC

Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流&#xff0c;会涉及到许多有意思的话题&#xff0c;诸如怎么确保对方能收到信息&#xff0c;怎么应对数据丢失、被污染或者顺序混乱&#xff0c;怎么提高…...

【向量库】Weaviate 搜索与索引技术:从基础概念到性能优化

文章目录 零、概述一、搜索技术分类1. 向量搜索&#xff1a;捕捉语义的智能检索2. 关键字搜索&#xff1a;精确匹配的传统方案3. 混合搜索&#xff1a;语义与精确的双重保障 二、向量检索技术分类1. HNSW索引&#xff1a;大规模数据的高效引擎2. Flat索引&#xff1a;小规模数据…...