浅谈排序算法:冒泡排序法和选择排序法的区别

article/2025/9/30 15:04:38

之前学习了冒泡排序法和选择排序法,最近被老师问某个道题用的是什么排序法。自己居然答不出来,才发现自己没有真正弄懂,这两个算法的原理和区别,所以·····

1冒泡排序法

1.1什么是冒泡排序法?

顾名思义,冒泡排序法,就是把要排序的一组数据中的元素当成一个一个气泡,每次比较相邻两个相邻“气泡”的"轻重’,“气泡”较重的往下"沉",轻的往上”浮“。

1.2原理

从第一个数开始,依次往后进行相邻两个数之间的比较,如果前面的数比后面的数大就交换这两个数的位置,如果前面的数较小或两者一样大,就不作处理。

1.3详细描述

➀比较相邻的元素的大小。如果第一个比第二个大,就交换它们两个的顺序;
➁对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
➂针对所有的元素重复以上的步骤,除了最后一个;
➃重复步骤➀~➂,直到排序完成。

1.4动态图片演示

在这里插入图片描述

1.5代码演示

1.5.1首先是从大到小

public class BubbleSortMax {public static void main(String[] args) {int[] array = { 1, 8, 5, 16, 32, 21 };int temp;System.out.print("原来数组排序为:");// for循环输出数组for (int i = 0; i< array.length; i++)System.out.print(array[i] + ",");//换行System.out.println();// 开始冒泡排序// 外层循环控制比较的趟数,一般为数组长度-1for (int i = 0; i < array.length - 1; i++) {// 内层循环控制每一趟排序多少次,一般为数组长度-外层循环变量-1for (int j = 0; j < array.length - i - 1; j++) {// 降序--如果前面小于后面则交换if (array[j] < array[j + 1]) {//引入temp变量作为交换媒介temp = array[j + 1];array[j + 1] = array[j];array[j] = temp;}}}System.out.print("由大到小的排序为:");// for循环输出数组for (int i= 0; i< array.length; i++)System.out.print(array[i] + ",");}
}

运行结果:
在这里插入图片描述
1.5.2从小到大排序

public class BubbleSortMin {public static void main(String[] args) {int[] array = { 1, 8, 5, 16, 32, 21 };int temp;System.out.print("原来数组排序为:");// for循环输出数组for (int i = 0; i < array.length; i++)System.out.print(array[i] + ",");// 换行System.out.println();// 开始冒泡排序// 外层循环控制比较的趟数,一般为数组长度-1for (int i = 0; i < array.length - 1; i++) {// 内层循环控制每一趟排序多少次,一般为数组长度-外层循环变量-1for (int j = 0; j < array.length - i - 1; j++) {// 升序--如果前面大于后面则交换if (array[j] > array[j + 1]) {// 引入temp变量作为交换媒介temp = array[j + 1];array[j + 1] = array[j];array[j] = temp;}}}System.out.print("由小到大的排序为:");// for循环输出数组for (int i = 0; i < array.length; i++)System.out.print(array[i] + ",");}
}

运行结果:
在这里插入图片描述

1.6对比分析

从上面两个排序我们可以发现,

1.外层控制循环的比较次数,循环次数:数组长度-1
2.内层控制循环排序次数,,循环次数:数组长度-外层循环变量-1
3.要实现一组数据的排序是从大到小还是从小到大,只需要改变下面这一行代码的比较大小符号即可。

if (array[j] > array[j + 1]) {

从小到大===大于号>

从大到小===小于号<

1.7冒泡排序法的主体框架

for (int i = 0; i < 数组长度变量名- 1; i++) {// 内层循环控制每一趟排序多少次,一般为数组长度-外层循环变量-1for (int j = 0; j <数组长度变量名   - i - 1; j++) {// 升序--如果前面大于后面则交换if (array[j] 视情况填写大于号和小于号array[j + 1]) {// 引入temp变量作为交换媒介temp = array[j + 1];array[j + 1] = array[j];array[j] = temp;}}}

1.8如何快速写出一个冒泡排序法

明白了原理,理解了从小到大和从大到小的规律,再记住冒泡排序法的基本框架,我们只需要确定几个量就可以写出一个冒泡排序法了。
步骤:
1.先确定所需要排序的数据元素个数----->用于确定外层循环的次数,循环次数:数组长度-1
2.确定内层循环次数,循环次数:数组长度-外层循环变量-1
3.根据从大到小还是从小到大的排序确定下面这行代码的符号
4.代入主体框架

if (array[j] 视情况填写大于号和小于号array[j + 1]) {

2.选择排序法

2.1什么是选择排序法?

还是顾名思义,选择排序法就是从需要排序的数据元素中 选出最小或最大的一个元素,把他和第一个位置的元素进行互换。

2.2原理

通过自定义的最小值元素的下标,在内层循环中通过下标进行比较,查找过程中不移动数位置, 如果发现比自定义最小值元素下标还要小的值,则将该值的下标赋值给自定义的最小值元素下标。在一次内层循环结束后,将最小值元素交换至数组左端。

2.3详细描述

将要排序的数组分成两个数组,一个是有序数组一个是无序数组,再定义一个最值下标
假定有序数组是数组的第一个元素,这个最值也假定为数组的第一个数,最值下标从第一个数开始
然后将有序数组中的数和最值下标指向的数进行比较, 如果无序数组中的数大于或小于有序数组中的数,那么将最大值或者最小值的下标更新为无序数组中那个值的下标
然后再将新的最大值或者最小值的下标和有序数组中的数比较,若大于或者小于,那就将它们两的值进行交换。

2.4动态图片演示

在这里插入图片描述

2.5代码演示

2.5.1首先是从大到小

public class SelectSortMax {public static void main(String[] args) {int[] a = { 1, 8, 5, 16, 32, 21 };int max;// 最大值下标int temp;// 外层循环控制循环次数,通常为数组长度-1for (int i = 0; i < a.length - 1; i++) {max = i;// 假设最大值是a[i],即a[0]for (int j = i + 1; j < a.length; j++) {if (a[j] > a[max])// 如果有比现在制定的最大元素还小的,就更新最大值下标max = j;}
//          退出内层循环后,判断最大下标是否
//			与原来相等,不等,说明有更大的,进行更新排序
//			if (a[i] != a[min]) {if (i != max) {// if (a[i] != a[min]) {//也可以更改这个temp = a[max];a[max] = a[i];a[i] = temp;}}for (int i = 0; i < a.length; i++)System.out.print(a[i] + ",");}
}

运行结果:
在这里插入图片描述
2.5.2从小到大排序

public class SelectSortMin {public static void main(String[] args) {int[] a = { 1, 8, 5, 16, 32, 21 };int min;// 最小值下标int temp;// 外层循环控制循环次数,通常为数组长度-1for (int i = 0; i < a.length - 1; i++) {min = i;// 假设最小值是a[i],即a[0]for (int j = i + 1; j < a.length; j++) {if (a[j] < a[min])// 如果有比现在制定的最小元素还小的,就更新最小值下标min = j;}
//          退出内层循环后,判断最小下标是否
//			与原来相等,不等,说明有更小的,进行更新排序if (i != min) {//	if (a[i] != a[min]) {// 也可以更改为这个temp = a[min];a[min] = a[i];a[i] = temp;}}for (int i = 0; i < a.length; i++)System.out.print(a[i] + ",");}
}

运行结果:
在这里插入图片描述

2.6对比分析

1.外层控制循环的比较次数,循环次数:数组长度-1
2.内层控制循环排序次数,循环次数:数组长度
3.要实现一组数据的排序是从大到小还是从小到大,只需要改变下面这一行代码的比较大小符号即可。

	if (a[j] < a[min])//或者是if (a[j] > a[max])

从小到大===大于号<

从大到小===小于号>

2.7冒泡排序法的主体框架

int max;// 最大值下标int temp;// 外层循环控制循环次数,通常为数组长度-1for (int i = 0; i < a.length - 1; i++) {max = i;// 假设最大值是a[i],即a[0]for (int j = i + 1; j < a.length; j++) {if (a[j] 视情况填写大于号和小于号 a[max])// 如果有比现在制定的最大元素还小的,就更新最大值下标max = j;}
//          退出内层循环后,判断最大下标是否
//			与原来相等,不等,说明有更大的,进行更新排序if (i != max) {// if (a[i] != a[min]) {//也可以更改这个temp = a[max];a[max] = a[i];a[i] = temp;}}

2.8如何快速写出一个冒泡排序法

还是和前面差不多。
1)明白原理,2)理解从小到大和从大到小的规律,3)再记住冒泡排序法的基本框架,
开始步骤:
1.先确定所需要排序的数据元素个数----->用于确定外层循环的次数,循环次数:数组长度
2.确定内层循环次数,循环次数:数组长度
3.根据从大到小还是从小到大的排序确定下面这行代码的符号
if (a[j] < a[min]) //或者是if (a[j] > a[max])

4.代入主体框架

3 最后总结

3.1两种排序算法之间的共同点

1)都有两层循环,外层循环控制比较的轮数,和数组元素的个数有关,内层循环控制需要参与比较的元素个数,和外层循环的轮数有关
2)两种算法进行交换的结构是相同的。(本文采用借助中间变量的方法交换是为了便于读者理解,在实际编程中,往往采用直接交换的写法,而不借助中间变量,来提高效率和简洁化)
3)两种算法虽然效率不一样,但是最终比较的次数是一样的。

如何区分两种算法?------个人技巧,大佬轻喷

1)最好的就是记住主体框架了(理解后就很好记了),当然实在记不住,那下面是一个小方法,

2)在选择排序算法中,会有定义一个记录最大值或者最小最小值下标的变量,只要是看到有一个这样的变量那就是选择排序算法,没有的话,就是冒泡排序法

3)就是我们一般常用的是冒泡排序法(看书和网上的案例都是冒泡居多)。但是如果项目涉及效率提高,性能优化的时候往往会使用选择排序法
为什么?
一是代码长度的问题,二是效率和复杂度问题,这个可以去看一下两个算法的排序换位操作。
冒泡排序算法中每次比较,两层循环都必须完全执行,因此对于任何情况下它的效率都是比较慢的。所以,你懂得。。。

4最后一些小问题解决

好像初中就学过,不过太久远,忘记了。

word横线怎么打
https://jingyan.baidu.com/article/00a07f380d690c82d028dcf9.html

在word文档中怎么设置每段的开头空两格?
https://zhidao.baidu.com/question/560399680.html

在Word中输入后文字下面会出现蓝色的双下划线怎么取消
https://www.kafan.cn/A/gvxexzp8nr.html

图片及部分内容借鉴于https://blog.csdn.net/weixin_40205234/article/details/86699088


http://chatgpt.dhexx.cn/article/dDMAsHNO.shtml

相关文章

Java语言实现常用的十种排序算法

排序问题一直都是程序工作或面试中的重点&#xff0c;特别是对于排序算法而言&#xff0c;在一些公司的笔试中&#xff0c;手写个冒泡啥的也不足为奇&#xff0c;因此今天抽空整理一下Java语言实现的各类排序算法&#xff0c;互勉学习一下。根据排序的不同方式大概可归为一下五…

排序算法(二)—— 选择法排序算法

1、选择法排序简介 选择法排序算法是一种常用的排序算法&#xff0c;他的实现方法是遍历数组所有元素&#xff0c;找出最小的元素&#xff0c;将它与第一个元素交换&#xff1b;然后遍历剩下的元素&#xff0c;找出最小的元素并与第二个元素交换&#xff1b;接下来再遍历剩下的…

Java编程:排序算法——选择排序

基本介绍 选择式排序也属于内部排序法&#xff0c;是从欲排序的数据中&#xff0c;按指定的规则选出某一元素&#xff0c;再依规定交换位置后达到排序的目的。 选择排序思想: 选择排序&#xff08;select sorting&#xff09;也是一种简单的排序方法。它的基本思想是&#x…

Java常用排序算法/程序员必须掌握的8大排序算法

本文由网络资料整理而来&#xff0c;如有问题&#xff0c;欢迎指正&#xff01; 参考链接&#xff1a;维基百科-排序算法 // 排序原始数据 private static final int[] NUMBERS {49, 38, 65, 97, 76, 13, 27, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15,…

排序算法:选择排序

1. 什么是选择排序&#xff1f;&#xff08;摘抄自百度百科&#xff09; 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。 它的工作原理是&#xff1a; 第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c…

排序算法——选择排序

目录 &#x1f43e;基本介绍 &#x1f31e;算法思想&#xff1a; &#x1f330;实例&#xff1a; ⛅思路分析&#xff1a; &#x1f308;总结&#xff1a; &#x1f6f4;代码实现: &#x1f6f9;算法性能分析 &#x1f355;时间复杂度 &#x1f367;空间复杂度 &…

基本算法-选择排序

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 本文介绍一种经典排序算法——选择排序&#xff0c;是入门级的排序算法之一。以下是本篇文章正文内容&#xff0c;包括算法简…

程序员八大排序算法之直接选择排序算法(java版)

一&#xff0c;选择排序算法思路&#xff1a;每趟选择序列的最小值/最大值&#xff0c;采取贪心选择策略。 二&#xff0c;选择排序算法有两种&#xff1a;1.直接选择排序 2.堆排序&#xff08;基于二叉树&#xff09;。 &#xff08;这里讲解直接选择排序&#xff09; 三&a…

排序算法--选择排序(Java实现)

选择排序概念 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。它的工作原理是&#xff1a;第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻…

java之选择排序

基本介绍 选择排序同样属于内部排序法&#xff0c;是从欲排序的数据中&#xff0c;按指定的规则选出某一元素&#xff0c;再按规定交换位置达到排序的目的。 排序思想 选择排序是一种简单的排序方法。它的基本思想是&#xff1a;第一次从arr[0]~arr[n-1]中选取最小值&#xf…

java选择排序(含选择排序代码)

目录 一&#xff1a;选择排序的思想 ​二&#xff1a;选择排序的代码 三&#xff1a;结果 一&#xff1a;选择排序的思想 选择排序是一种简单直观的排序算法。它的工作原理是&#xff1a;第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&…

选择排序算法

选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的工作原理是&#xff1a;第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻找到最小&…

Java——常见的几种排序算法

一、冒泡排序 每次冒泡过程都是从数列的第一个元素开始&#xff0c;然后依次和剩余的元素进行比较, 跟列队一样, 从左到右两两相邻的元素比大小, 高的就和低的换一下位置. 最后最高(值最大)的肯定就排到后面了. 但是这只是把最高的排到后面了, 还得找出第二高的, 于是又从第一…

Java实现选择排序

Java实现选择排序 选择排序原理为&#xff1a;随机确定一个标志位&#xff08;一般为第一个数字&#xff09;作为最小数&#xff0c;然后向后遍历&#xff0c;找到比标志位更小的数便与标志位互换位置并更新最小数&#xff0c;实现步骤为&#xff1a; 将数组的第一个数字设置…

【算法】选择排序法

一、介绍 1.选择排序法是将序列分为两段&#xff0c;有序前列和无序后列&#xff0c;每次查找无序后列中最大元素&#xff0c;将其插入到有序前列的最末尾处&#xff0c;直至无序后列最后一个元素&#xff0c;最终排序后的序列为降序序列 2.适用于包括数组和向量在内的序列 …

选择排序的两种算法(Java代码实现)

目录 选择排序&#xff1a; 基本思想&#xff1a; 1&#xff1a;简单选择排序&#xff1a; 基本思想&#xff1a; 过程&#xff1a; 2&#xff1a;堆排序&#xff1a; 基本思想&#xff1a; 过程&#xff1a; 选择排序&#xff1a; 基本思想&#xff1a; 每一趟从待排序…

Java选择排序

1. 选择排序 选择排序是一种简单直观的排序算法&#xff0c;其基本原理是每一次从待排序的数组里找到最小值&#xff08;最大值&#xff09;的下标&#xff0c;然后将最小值&#xff08;最大值&#xff09;跟待排序数组的第一个进行交换&#xff0c;然后再从剩余的未排序元素中…

数据仓库理论知识

数据仓库 1.1 数仓基础知识 1.1.1. 为什么要有数据仓库 通常数据仓库的数据来自各个业务应用系统。业务系统中的数据形式多种多样&#xff0c;可能是 Oracle、MySQL、SQL Server 等关系数据库里的结构化数据&#xff0c;可能是文本、CSV 等平面文件或 Word、Excel 文档中的数…

数据仓库技术中的MPP

数据仓库世界里面的massively parallel processing 大概定义&#xff1a; MPP 是将任务并行的分散到多个服务器和节点上&#xff0c;在每个节点上计算完成后&#xff0c;将各自部分的结果汇总在一起得到最终的结果。       首先MPP 必须消除手工切分数据的工作量。 这是…