冒泡排序----深刻理解版本

server/2024/10/11 13:23:02/

前面虽然向大家介绍了冒泡排序,但是表达的不是很清楚,这次我带着更深刻的理解向大家介绍以下冒泡排序。

1.冒泡排序

冒泡排序其实是一种排序算法,通过数据之间的相互比较将一堆混乱的数据按照升序或者降序的顺序排列。

2.解题思路

解题思路依然不变,我们首先确立要比较的趟数,和一趟要比较的次数。

d46b094ca2e942bca08400760ab77b39.png

第一趟比较(红色部分)

76da688f65dc454c86e92443337bb85c.png

第二趟比较(绿色部分)

8c8e1e5abb4f4a9c8747caef26d9595b.png

第三趟比较(蓝色部分)

5f1ba9f5a4f54dedac48ba90e010b3e7.png

第四趟比较

11a3218ba26b4b218b6bdf6ea53a78f6.png

如上图所示,假设我们有五个数据要进行排序,我们要进行4趟排序,第一趟排序要进行比较4次,第二趟排序要比较3次,第三趟排序要比较2次,第四趟排序要进行比较1次。

所以我么得出结论:n个数据要进行排序时,要进行n-1趟排序。这里的趟数也是已经排序好数据的个数。 

代码实现

java">public class MySort {public static void Bubble(int[] arr){//确立趟数int i=0;for(i=0;i< arr.length-1;i++){//一趟要比较的次数for(int j=0;j< arr.length-1-i;j++){if(arr[j]>arr[j+1]){int tmp=arr[j];arr[j]=arr[j+1];arr[j+1]=tmp;}}}}public static void main(String[] args) {int[] arr=new int[]{10,8,6,9,3};System.out.print("排序前:");for(int j:arr){System.out.print(j+" ");}System.out.println();Bubble(arr);System.out.print("排序后:");for(int x:arr){System.out.print(x+" ");}}
}

这里我要介绍以下我更加深刻理解冒泡排序的一点,就是第二个for循环确定一趟要比较的次数,

其实上面是一种已经优化的版本了,未优化的版本循环条件为 j<arr.length-1在这种情况下,就意味着我们不论是进行哪一趟排序,在这一趟排序循环里面,它都会和所有的数据进行比较。不管之前经过排序就已经排序好的数据。

当我们写成 j<arr.length-1-i时,这里的i代表第几趟排序,经过i趟排序,就表示原本的数据中已经有i个数据已经排序好了,也就是说i也代表排序好的数据接着我们进行下一趟排序时,这一趟要排序的数据就不会和已经排序好的数据进行比较了,这要就提高的效率。

运行代码,如下图所示

3718e75557bb492cac28a4a543aa0897.png

但这还不是更好的优化版本。

先假设我们一开始的数据为10  3  6  8  9。

这时我们只进行一次比较就已经将数据排序好了,但是按照上面的写法,后面还是会进行后面比较的趟数,所以我们可以设计一个标志来确定在某一趟排序的时候,数据是否已经完全排序好了。

优化代码实现

java">public class MySort {public static void Bubble(int[] arr){//确立趟数int i=0;for(i=0;i< arr.length-1;i++){boolean flag=true;//标记//一趟要比较的次数for(int j=0;j< arr.length-1-i;j++){if(arr[j]>arr[j+1]){int tmp=arr[j];arr[j]=arr[j+1];arr[j+1]=tmp;flag=false;}}if(flag==true){break;}}}public static void main(String[] args) {int[] arr=new int[]{10,8,6,9,3};System.out.print("排序前:");for(int j:arr){System.out.print(j+" ");}System.out.println();Bubble(arr);System.out.print("排序后:");for(int x:arr){System.out.print(x+" ");}}
}

我们设置了一个flag变量,一开始为true,如果有 没排序好的数据就会进入循环,将flag的值变为false,进行完这一趟的排序,就又进行下一趟排序,然后在来确定有无 没排序好的数据,如果没有,就不会进入第二个循环,最终flag的值为true。这时我们根据flag的值为true,就知道此时数据已经完全排序好了。 


http://www.ppmy.cn/server/42236.html

相关文章

租赁商城小程序基于ThinkPHP+FastAdmin+UniApp(源码搭建/上线/运营/售后/更新)

提供用户物品租赁服务的应用程序&#xff0c;方便客户搭建各种类型的租赁场景服务。通过小程序端多角色进行平台管理&#xff0c;用户租赁商品缴纳租金及押金&#xff0c;员工端可操作商品出库和归还&#xff0c;订单完成后押金原路退回。 ​在线预约和支付&#xff1a;用户可以…

【C++】学习笔记——多态_1

文章目录 十二、继承8. 继承和组合 十三、多态1. 多态的概念2. 多态的定义和实现虚函数重写的两个特殊情况override 和 final 3. 多态的原理1. 虚函数表 未完待续 十二、继承 8. 继承和组合 我们已经知道了什么是继承&#xff0c;那组合又是什么&#xff1f;下面这种情况就是…

MySQL--增删改查案例演示

一&#xff1a;显示数据库及模糊查询&#xff08;like&#xff09; mysql> show databases; -------------------- | Database | -------------------- | db_classes | | db_user | | information_schema | | mysql | | perfor…

【STM32-MX_GPIO_Init分析】

MX_GPIO_Init分析源码如下&#xff1a; __HAL_RCC_GPIOE_CLK_ENABLE源码如下&#xff1a; #define RCC ((RCC_TypeDef *) RCC_BASE) #define RCC_BASE (AHB1PERIPH_BASE 0x3800UL) #define AHB1PERIPH_BASE (PERIPH_BASE 0x00020000U…

部署xwiki服务需要配置 hibernate.cfg.xml如何配置?

1. 定位 hibernate.cfg.xml 文件 首先&#xff0c;确保您可以在 Tomcat 的 XWiki 部署目录中找到 hibernate.cfg.xml 文件&#xff1a; cd /opt/tomcat/latest/webapps/xwiki/WEB-INF ls -l hibernate.cfg.xml如果文件存在&#xff0c;您可以继续编辑它。如果不存在&#xff…

vsCode 设置上下级文件夹目录分离展示?

默认情况下&#xff0c;vsCode目录文件夹会使用/合并展示在一行&#xff0c;这样视觉上看着并不直观&#xff0c;设置目录文件分离展示方法如下&#xff1a; 1、点击左下角设置图标&#xff0c;点击setting&#xff1b; 2、搜索栏输入compact&#xff1b; 3、取消勾选第一个选…

Qt运行时,如何设置第一个聚焦的控件

问题&#xff1a;Qt第一个聚焦的控件&#xff0c;如何自行设置&#xff1f; 尝试&#xff1a; 1.在代码中设置 lineEdit->setFocus() 。无效&#xff01; 2.Qt Designer–打开form1.ui–菜单栏下一行–Edit Tab Order–按顺序点击–菜单栏下一行–Edit Widgets–退出。无效…

C++ STL概念之 仿函数(函数对象)/ 空间配置器 / 适配器 / 理解STL

仿函数&#xff08;函数对象&#xff09; 什么是仿函数 仿函数&#xff0c;或称为函数对象&#xff0c;在C中是通过重载operator()的类实例&#xff0c;使得类的实例能够像函数一样被调用。 可调用对象 函数指针&#xff08;Function Pointers&#xff09;: 这是指向函数的指…