首页 > 其他分享 >6分钟彻底掌握冒泡排序

6分钟彻底掌握冒泡排序

时间:2022-11-25 14:00:45浏览次数:42  
标签:彻底 元素 数放 冒泡排序 分钟 序列 排序 比较

冒泡排序原理

    冒泡排序(Bubble Sort),重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。


冒泡排序思路

    1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

    2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。最后的元素应该会是最大的数。

    3. 针对所有的元素重复以上的步骤,除了最后一个(即已经排好的元素)。

    4. 重复上面的步骤,直到没有任何一对数字需要比较。


冒泡排序步骤

依次比较相邻的元素。如果第一个比第二个大,就交换他们两个。

(1)第一轮比较:比较第1和第2个元素,将小的数放前面,将大的数放后面。

(2)比较第2和第3个元素,将小的数放前面,将大的数放后面。

...

(3)比较第n - 1和第n个元素,将小的数放前面,将大的数放后面。此时第n个元素是序列最大的元素,已经将该元素移至序列尾,已经把此元素位置确定下来。不参与下一轮比较。

(4)第二轮比较:比较第1和第2个元素,将小的数放前面,将大的数放后面。

(5)比较第2和第3个元素,将小的数放前面,将大的数放后面。

...

(6)比较第n - 2和第n - 1个元素,将小的数放前面,将大的数放后面。此时第n - 1个元素是序列第二大的元素,已经把此元素位置确定下来。不参与下一轮比较。

...

(7)第n - 1轮比较:比较第1和第2个元素,将小的数放前面,将大的数放后面。此时序列已经排完序。


冒泡排序实例

假设待排序的序列为{10,34,2,52,28}。

6分钟彻底掌握冒泡排序_子序列


第一轮比较:

首先比较第一和第二个元素,第一个元素10小于第二个元素34,符合排序规则,继续进行下一次比较。

6分钟彻底掌握冒泡排序_冒泡排序_02


比较第二和第三个元素,第二个元素34大于第三个元素2,交换两个元素。

6分钟彻底掌握冒泡排序_冒泡排序_03


交换后两个元素符号排序规则,继续进行下一次比较。

6分钟彻底掌握冒泡排序_子序列_04


比较第三和第四个元素,第三个元素34小于第四个元素52,符合排序规则,继续进行下一次比较。

6分钟彻底掌握冒泡排序_冒泡排序_05


比较第四和第五个元素,第四个元素52大于第五个元素28,交换两个元素。

6分钟彻底掌握冒泡排序_冒泡排序_06


第一轮比较结束,元素52是此序列最大元素,已经将其移至序列最右边,其位置已经确定,不再参与下一轮比较。

6分钟彻底掌握冒泡排序_排序规则_07


第二轮比较:

首先比较第一和第二个元素,第一个元素10大于第二个元素2,交换两个元素。

6分钟彻底掌握冒泡排序_子序列_08


交换后两个元素符号排序规则,继续进行下一次比较。

6分钟彻底掌握冒泡排序_冒泡排序_09


比较第二和第三个元素,第二个元素10小于第三个元素34,符合排序规则,继续进行下一次比较。

6分钟彻底掌握冒泡排序_排序规则_10


比较第三和第四个元素,第三个元素34大于第四个元素28,交换两个元素。

6分钟彻底掌握冒泡排序_冒泡排序_11


第二轮比较结束,元素34是此子序列最大元素,已经将其移至此子序列最右边,其位置已经确定,不再参与下一轮比较。

6分钟彻底掌握冒泡排序_子序列_12


第三轮比较:

首先比较第一和第二个元素,第一个元素2小于第二个元素10,符合排序规则,继续进行下一次比较。

6分钟彻底掌握冒泡排序_排序规则_13


比较第二和第三个元素,第二个元素10小于第三个元素28,符合排序规则。

6分钟彻底掌握冒泡排序_子序列_14


第三轮比较结束,元素28是此子序列最大元素,已经将其移至此子序列最右边,其位置已经确定,不再参与下一轮比较。

6分钟彻底掌握冒泡排序_冒泡排序_15


第四轮比较:

首先比较第一和第二个元素,第一个元素2小于第二个元素10,符合排序规则。

6分钟彻底掌握冒泡排序_子序列_16


第四轮比较结束,元素10是此子序列最大元素,已经将其移至此子序列最右边。整个序列已经排序完成。

6分钟彻底掌握冒泡排序_子序列_17


冒泡排序分析

    (1)n个数字要排完序,一共要进行n - 1轮排序,每i趟的排序次数为(n - i)次。

    (2)冒泡排序优点:每进行一趟排序,就会少比较一次,因为每进行一轮排序都会找出此轮序列中的最大值,下一轮不再对此最大元素排序。

    (3)时间复杂度:如果序列已经排完序,只需要走一轮即可。这种情况是冒泡排序的最好情况,时间复杂度为O(n)。如果序列是逆序的,则需要进行n - 1轮排序。每轮排序要进行n - i次比较(1 ≤ i ≤ n-1)。这种情况是冒泡排序的最坏情况,时间复杂度为O(n2)。因此,冒泡排序总的平均时间复杂度为O(n2)。

    (4)稳定性:冒泡排序就是把小的元素往前调或者把大的元素往后调。排序过程中相同元素的前后顺序并没有改变,冒泡排序是一种稳定排序算法。


冒泡排序代码实现(Java版本)

public void bubbleSort(int[] array) {
// 如果序列为空 或者 序列长度为1 直接返回即可
if (array == null || array.length < 2)
return;
// 遍历序列
for(int i = 0 ;i < array.length - 1; ++i) {
// 第i轮比较
for(int j = 0 ;j < array.length - i - 1; ++j) {
// 比较序列第 j 个元素和第 j+1 个元素
// 如果 第j个元素大于第j+1个元素,就互换两个元素
if(array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}



标签:彻底,元素,数放,冒泡排序,分钟,序列,排序,比较
From: https://blog.51cto.com/u_15891283/5886641

相关文章

  • 5分钟搞定快速选择
    快速选择思想快速选择思想源于快速排序,但我们只进行部分快速排序,只要找到我们要的位置上的元素,排序就不再进行下去。快速选择的方法跟快速排序基本一致,差别在于我们有给定要......
  • 5分钟搞定快速排序
    快速排序思想    最开始找出一个基准值,通过一趟排序将待排序的序列分割成独立的两个部分,前面的这一部分元素都比基准值小,后面这一部分的元素都比基准值大。然后分别再对......
  • P6186 [NOI Online #1 提高组] 冒泡排序
    随便给出一组数据:53124初始逆序对数量:\(6\)。冒泡排序一轮:31245\(6-4=2\)。两轮:12345\(2-2=0\)。观察会发现,数\(x\)会一直后退,直到有一个大于\(......
  • 彻底理解c的宏定义
    为了更方便的理解宏定义,可以直接输入​​g++c文件-E​​生成处理之后的源文件​​#​​​代表把#后面的变量用双引号包裹起来,也就是转换为字符串​​##​​前面和这个参数......
  • 用户提交订单,30分钟还没付款,取消订单功能分析
    摘要用户提交订单,30分钟还没付款,取消订单功能分析统一来说,业务有“在一段时间之后,完成一个工作任务”的需求。实现这种定时任务有哪些方法呢,来总结一下想到的方法。一、定时......
  • luogu P8500 [NOI2022] 冒泡排序
    题面传送门这个部分分提示得太妙了。首先这个冒泡排序的壳已经被套烂了,就是对逆序对计数。首先观察一下,发现第一个样例解释中在等于某个限制对应的最小值的时候取到逆序......
  • 输入一个时间求出有几个小时几分钟
    这道题很简单最常用的解法#include<stdio.h>intmain(){inta,b,c;printf("请输入你要求的时间:");scanf("%d",&a);b=a/60;c=a%60;printf("%d分钟有%d小时%d分钟",a,b,c);ret......
  • 360安全卫士弹窗广告怎么彻底关闭
     如何关闭360广告弹窗?有时候我们在电脑上看一些视频或者整理一些文件时,经常莫名其妙会出现一些广告弹窗,即使是关了也还会出现,很是影响用户体验感,那么怎么彻底关闭呢?下......
  • 分分钟实现追剧自由,这些浏览器的功能太实用了
    还在发愁找不到免费的影片吗?本着省钱的原则,坚决不浪费白嫖的机会,今天教大家几招,如何使用浏览器实现追剧自由。让什么VIP统统走开,帮助大家省下一大笔钱,分分钟实现免费追剧......
  • luogu P8859 冒泡排序
    题面传送门首先\(type=1\)的情况是平凡的,设可以发现一个数不需要被操作当且仅当这个数前面的数都小于这个数。可以设计出这样的dp:设\(f_{i,j}\)表示到了第\(i\)个数,前面有......