java实现排序算法之交换排序(冒泡排序和快速排序)

Dify 1.1.3部署避坑指南:用wait-for-it.sh解决PostgreSQL初始化失败问题 本文详细解析了Dify 1.1.3部署中遇到的插件数据库初始化失败问题,并提供了使用wait-for-it.sh脚本的实战解决方案。通过剖析Docker Compose服务依赖管理的局限性,指导用户如何改造镜像与配置,确保服务按正确顺序启动,从而有效解决数据库连接失败等部署难题。 阅读详情

前端时间考研,复习了不少基础算法,决定趁这个机会总结一下,近期我会把常用的八大排序算法都总结到,算是对自己前段时间的总结:排序算法按排序方式可分为交换排序,选择排序,插入排序和归并排序,基数排序,现在先来介绍交换排序:

交换排序是指通过交换元素位置来实现算法的排序:最典型的就是冒泡排序和快速排序,下面分别讲解这两种算法:

冒泡排序:

算法思想:通过从前往后或者从后往前两两比较相邻元素的值,逐级把最大的元素或者最小的元素给甄选出来,结果将最小(大)的元素交换至待排序列的第一个位置,下一趟冒泡时,已经确定的元素不在参与比较。

稳定性:稳定

时空复杂度与初始状态是否有关:是

时间复杂度:

最好情况O(n)——元素已经有序,排序时只需比较n-1次,无须移动元素

最坏情况O(n^2) ——元素逆序 ,排序时比较次数为n(n-1)/2, 移动次数为:3n(n-1)/2

平均情况O(n^2)

下面是java实现的代码:

public class Main {
	
	public static void main(String[] args) {
		int []a={4,9,2,7,1,8,9,5,3};
		BubbleSort(a);//传入的是引用
		print(a);
		
	}

	public static void  BubbleSort(int [] target){
		int length=target.length;
		for(int i=0;i<length-1;i++){//趟数n-1
			boolean changeFlag=false;//表示本趟冒泡是否交换了元素
			for(int j=0;j<length-1-i;j++){
				if(target[j]>target[j+1]){//一趟排序确定一个最大元素,当然也可以是确定最小的元素,不过要改for循环从后往前遍历
					int temp=target[j];
					target[j]=target[j+1];
					target[j+1]=temp;
					changeFlag=true;
				}					
			}	
			if(changeFlag==false)return ;//若没交换,则说明元素已经有序
		}
		return ;
		
	}
	public static void print(int []target){
		for(int i=0;i<target.length;i++){
			System.out.print(target[i]+",");
		}
	}
}

快速排序:感觉不管是考研还是工作面试,或者以后的工作中,感觉这个算法用到的地方还是蛮多的,

算法思想:这个基本思想是基于分治法的:在待排序表中任取一元素pivot作为基准,然后通过一趟排序将排序表划分为大于等于privot元素和小于privot元素的两个部分,将privot放在两部分中间的位置上,这个位置就是其在这个表上的最终位置,这个过程称为一趟快速排序,也就是说每一次快速排序,都会确定一个元素的最终位置。而后分别递归的对这两部分重复上述过程,直到每部分都只有一个元素或为空为止,这样元素都放在了其最终的位置上。这样说每个人应该都能看懂,可是实际操作起来,就发现没那么简单,因为我们并不能把元素都取出分为一个一个的,然后把小的放在privot左边,大的放在privot'右边,因为数组中的地址是固定不变的,我们能做的只是寻找出privot在数组中的位置,然后将privot放入其中就好,因此这个算法的重点是找到privot的位置。

稳定性:不稳定

时空复杂度与初始状态是否有关:是

时间复杂度:与划分是否对称有关,即取到的privot值是否能将表划分为两部分等长的元素

最好情况O(nlog2^n) ——每次划分均等分

最坏情况O(n^2)——初始排序已基本有序或逆序

空间复杂度:就是额外需要用到的空间,本算法就是递归用到的栈的深度

最好情况:O(log2^n) 

最坏情况:O(n)

java实现的代码:

public class Main {
	
	public static void main(String[] args) {
		int []a={4,9,2,7,1,8,9,5,3};
		quickSort(a,0,a.length-1);
		print(a);
	}
	
	public static void quickSort(int []a,int low,int high){
		if(low<high){//递归结束条件 low>high
		int middle=getMiddle(a,low,high);
		quickSort(a,low,middle-1);
		quickSort(a,middle+1,high);
		}
		
	}
	public static int getMiddle(int []a,int low,int high){//划分函数
		int privot=a[low];//一般取数组中第一个元素作为基准,用privot保存基准值,数组中空出一个空位
		while(low<high){
			while(low<high&&a[high]>=privot)high--;//先从后往前遍历寻找到比privot小的值
			a[low]=a[high];//将比privot小的值放入基准的位置,这时又空出一个空位
			while(low<high&&a[low]<=privot)low++;//然后从前往后遍历寻找比privot大的值
			a[high]=a[low];//然后把寻找到的值,放入上面寻找到的位置上
		}//当low比high大时,说明已经找到位置
		a[low]=privot;//low所指向的位置就是privot的最终位置
		return low;
	}
	public static void print(int []target){
		for(int i=0;i<target.length;i++){
			System.out.print(target[i]+",");
		}
	}

}


谢谢观看!
TC3XX - MCAL知识点(二十):CAN MCAL配置及代码实战(CAN/CANFD/extenen CAN) CAN驱动程序负责提供AUTOSAR指定的标准CAN通信服务。M_CAN单元是底层的CAN硬件单元,它由共享消息RAM(在AUTOSAR中称为硬件对象)的节点(在AUTOSAR中称为控制器)组成。CAN驱动提供以下服务:·初始化CAN控制器以控制CAN控制器的行为和状态·设置和修改CAN控制器的波特率配置·支持CAN和CAN FD帧的收发·在轮询和中断模式下,成功的帧传输通知,专用和FIFO消息的接收和总线事件通知·数据接收使用接收FIFO功能·假装网络模式处理·支持多读/写周期功能。 阅读详情

相关推荐

逆向Shopee签名机制:从参数分析到稳定采集方案

本文深入解析了Shopee签名机制的逆向过程,从参数分析到稳定采集方案的实现。通过抓包定位关键参数`sap-ri`和`x-sap-sec`,还原了签名生成算法,并提供了Python实现代码。文章还分享了反反爬策略、性能优化技巧及长期维护建议,帮助开发者构建稳定的Shopee数据采集方案。

weixin_27722377的博客 672

交换排序问题--分治思想

通过交换元素位置实现排序的算法通常称为交换排序算法。如果只允许交换相邻元素的位置,则称为相邻交换排序算法。例如,冒泡排序就是一种相邻交换排序算法。对于给定的待排序元素序列,计算相邻交换排序算法最少需要交换多少次元素位置?一共有两行输入,第一行是正整数n(n

m0_55462431的博客 491

DolphinScheduler租户配置踩坑实录:手把手教你修复‘tenant not exists‘报错

本文深度解析DolphinScheduler的租户模型,并提供一套从界面到数据库的系统性排查流程,手把手教你修复常见的'tenant not exists'报错。文章揭示了该错误的本质是用户与租户数据关联不一致,并给出了通过UI或SQL更新的具体修复方案,同时分享了根因分析与预防措施,帮助用户从根本上理解和避免此类问题。

2w3e4r5t6y的博客 541

常见排序算法的实现------交换排序

交换排序: 交换排序的分类: 冒泡排序 快速排序 1.冒泡排序: 思想:从数组的末尾元素开始比较两个元素的大小,然后根据大小换位置,直到将最大或最小的元素排到数组的起始位置; 代码实现如下: void Swap(int *left,int* right){ in tmp=*left; *left=*right; *right=tmp; } void Bubblesort(int ar...

DX_Jone的博客 484

树莓派5首次开机保姆级教程(无显示器通过VNC连接树莓派桌面)

选择 Interface Options > VNC > Yes 启用服务。2.在Windows电脑上安装VNC软件。重启树莓派:sudo reboot。3.使用VNC远程访问树莓派桌面。

qq_34184505的博客 2349

数据本体论如何指导数仓建模?

数据本体论指导数仓建模的核心在于构建业务语义与数据结构的桥梁。该方法从业务域中抽象标准化知识体系,包含核心概念、属性、关系和规则五大要素,并将其映射为分层数仓模型。通过"业务本体梳理→本体建模→模型映射→治理迭代"的流程,实现数仓从"结构存储"到"语义载体"的升级。相比传统建模,该方法能解决语义不一致、跨域融合难等问题,使数仓具备更好的可扩展性和业务对齐性。实践表明,以数据本体论为指导的数仓建模能显著提升数据资产的可理解性和复用价值。

石榴姐yyds 395

C语言-交换排序(Swap Sort)

1.冒泡排序(Bubble Sort): void BubbleSort(int *r) { int i,j; for(i=0;i<Maxsize;i++) for(j=1;j<Maxsize-i;j++) if(r[j-1]>r[j]) Swap(r[j-1],r[j]); } 2.升级版冒泡排序: //冒泡排序2 void BubbleSort2(int *r) { int j,k; Bool flag;

Attract's Blog 6162

图文:银行核心账务处理逻辑(白话篇)

银行账务系统分为对内账(记录银行自身资产负债)和对外账(处理客户交易),通过特定编码规则的账号体系进行管理。采用T型账户结构和凭证制度确保每笔交易可追溯,通过明细核算与综合核算双线并行、每日轧账核对(科目日结单、总账、日计表)实现账务精准平衡。从业务触发到最终账平的全流程体现了银行账务"分层记录、双向核对、闭环校验"的核心原则,保障资金流动的透明性与安全性。

银行信息系统应用架构详解 540

交换排序的两种算法(Java代码实现)

交换排序:1.冒泡排序。2.快速排序。

qq_54414566的博客 1329

Qt 国产嵌入式操作系统实现文字转语音功能(ekho库)

Qt 国产嵌入式操作系统实现文字转语音功能(TTS)_tts驱动 转文字-优快云博客在继上篇文章之后,甲方粑粑不满意使用eSpeak发出的声音太难听了,这就不得不找个替代品,声音稍微好听了一些。使用ekho开源库。Ekho(余音)是一个免费、开源的中文语音合成软件。它目前支持粤语、普通话(国语)、诏安客语、藏语、雅言(中国古代通用语)和韩语(试验中),英文则通过Festival间接实现。Ekho支持Linux、Windows和Android平台。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 2754

手把手教你学simulink(12.10)--设计和仿真一个用于控制飞机纵向运动(高度和速度)的多变量控制系统

飞机的纵向运动控制是航空工程中的一个重要问题,涉及飞机的高度和速度的精确控制。多变量控制系统可以同时控制多个飞行参数,确保飞机在最佳条件下运行。Simulink提供了一个强大的平台,用于建模、仿真和分析动态系统,非常适合设计和测试多变量控制系统。通过本项目的实施,我们成功设计和仿真了一个用于控制飞机纵向运动(高度和速度)的多变量控制系统。该项目展示了从系统建模、控制器设计、仿真验证到结果分析的完整流程,为多变量控制系统的设计提供了有价值的参考。

MHD0815的博客 598

快速排序(交换排序)——思路及代码实现

快速排序: 快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法。 基本步骤为: 1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素; 2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边; 3.对左右两个分区重复以上步骤直到所有元素都是有序的。 下面来看一个完整的演示过程: ...

呆呆的丑小鸭的博客 582

国科大学习资料--高级软件工程-复习题简答题答案

国科大学习资料–高级软件工程(罗铁坚 魏峻 刘丹)-复习题简答题答案 def fib3 n (1…n).inject([0,1]){|mem| puts mem[0]+mem[1]; [mem[1],mem[0]+mem[1]]} end =====================================================================================================================================

无名何许人的博客 1399

排序算法小结(二)——交换类排序(Java实现):冒泡排序、快速排序

排序算法小结(二)——交换类排序(Java实现):冒泡排序、快速排序

xx2014301318的博客 205

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java交换排序算法的2个实现(冒泡排序排序、快速排序)

冒泡排序稳定性:稳定 冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。 快速排序稳定性:不稳定 快速排序有两个方...

爱的叹息的专栏 683

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

交换排序算法之冒泡排序和快速排序,java简单实现

/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package Sorting; import java.util.Scanner; /** * * @author Biaoming */ public class ExchangeSor

钟彪明的专栏 841

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

排序算法--交换排序(冒泡排序、快速排序、随机快速排序)java实现

交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。   package sortAlgorithms; /* * @author x@j * @date 2013-10-01 * @content BubbleSort * 冒泡排序的思想:假设有N个数据需要排

xjliww123的专栏 767

java实现排序算法之交换排序(冒泡排序、快速排序)

交换排序的主体操作是对数组中的数据不断进行交换操作。交换排序主要有冒泡排序和快速排序。 [color=red][b]一、冒泡排序[/b][/color] 冒泡排序,是指计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序、快速排序的O(nlogn,底数为2),但是有两个优点:1.“编程复杂度”很低,很容易写出代码;2.具有稳定性,这里的稳定性是指原序列中相同元素的相...

Cliff-来至大山里的娃 170

算法(Java实现)-图解十大经典排序算法(一)——交换排序(冒泡排序、快速排序)

1、排序算法 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。 2、排序的分类 2.1按使用内存情况分 内部排序: 指将需要处理的所有数据都加载到内部存储器中进行排序。 外部排序法: 数据量过大,无法全部加载到内存中,需要借助外部存储进行 排序。 2.2按是否为比较类分 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比

jQueryZK的博客 2467

java 中常见的排序——交换排序(冒泡排序,快速排序)

java中常见的排序——交换排序 交换排序的基本思想概述 冒泡排序:在一个数组中,依次比较相邻的两个数据,小的数据放在前面,大的数据放在后面。就是说:如果前面的数大于后面的数就交换位置,交换位置之后再与下一个数据进行比较,如果前面的数小于后面的数,就不用交换。 快速排序: 在一个数组中,第一个元素与最后一个元素开始往前依次比较,如果第一个元素小于被比较的元素则继续比较,如果大于被比较的元素则交换...

qq_31322085的博客 1383

【唐叔学算法】第19天:交换排序-冒泡排序与快速排序的深度解析及Java实现

特性冒泡排序快速排序时间复杂度O(n²)平均 O(n log n),最坏 O(n²)空间复杂度O(1)O(log n)稳定性稳定不稳定适用场景小规模数据或基本有序数据大规模数据或随机数据。

唐叔学习中... 866

两种常用的交换排序算法--冒泡排序、快速排序

本文介绍两种常用的交换排序算法:1、冒泡排序算法 平均时间复杂度O(n^2) 稳定的排序算法2、快速排序 最差时间复杂度为O(n^2) 但是平均时间复杂度为O(n ln n) 最坏情况下空间复杂度为O(n) 最好情况下空间复杂度为O(ln n)下面用java代码来说明算法思路:1、冒泡排序算法:public class ExchangeRanker { //冒泡排序 不断比较相邻两个元素的...

TimeTDIT的博客 1833

快速排序算法和冒泡排序算法的java实现

/** * *快速排序算法 *思路:将要排序的数据通过一次排序分割成两部分,其中一部分的数据要比另一部分的所有数据小, * 然后再按照这样的方法分别对两部分数据进行快速排序。 **/ public class QuickSort{ /** *排序算法 *@prameter data,待排序的数据 *@prameter left,data的左边开始的索引 *@prameter

yazongliu的专栏 636

经典排序问题:快速排序 与 冒泡排序

最近在看2020年考研素材,哭 什么算法都自己动手写一遍吧 关于时间复杂度系列~ 但是这种书上的实现方式,其实也蛮巧妙地,如果是面试也蛮好记住 但是,归其原理, 还是两个哨兵,high哨兵和low哨兵 high就不断地找比基准值小的, 然后low哨兵就不断找比基准值大的, 然后两者进行交换, 最终如果low == high 那么也就是这一次基准值归位了~ 然后进行递归实现...

新一的技术笔记 258

排序算法之交换排序

交换排序之冒泡排序 冒泡排序算法的基本思想是:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序,则交换位置,直到序列比较完成,我们称之为一趟冒泡。如下图所示(示意下沉):( 下一趟比较时候就只需要比较到倒数第二个数字。) Java实现如下: public void bubbleSort2(int[] numbers){ for (int i = 0; i...

Hall_P的博客 395

java 快速排序,冒泡排序

快速排序:网上说是冒泡排序的一种改进。 思路:比如要排序的是 String[] strVoid = new String[] { "11", "66", "0", "55", "22"}; 1找到一个比较点 这里选择中间的数 0,然后找到这个数左边的比这个数大的数,在找的这个数右边的比这个数小的数,然后对找到的两个数互换位置, 接下来使用左边数中的下一个数,【即下标加1】,使用右

一路学习 443
上一篇: 十进制,二进制,八进制的相互转换
下一篇: java实现排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)
NFMSR
博客等级 码龄11年 59粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值