冒泡排序算法原理和代码实现,就是这么简单!

冒泡排序,是比较简单的一种排序算法

它的命名源于它的算法原理:重复的从前往后(或者从后往前),依次比较记录中相邻的两个元素,如果他们顺序错误就把它们交换过来,直到没有再需要交换的元素,就说明该记录已完成排序。

它看起来就像是把最大的元素(或最小的元素)经由交换慢慢的‘浮’到数列的顶端,故名冒泡排序。

算法原理


我们通过将一个无序数列按升序排序来演示算法原理。

图片

算法流程:

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

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

3. 针对所有元素重复步骤 1,2,除了最后一个元素,这时倒数第二个元素应该会是第二大的数。

4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

图解步骤:

有一个数列 [4, 2, 6, 5, 3, 9],通过冒泡排序的步骤如下:

图片

代码实现


总结:

1、一个长度为 n 的数列,我们最多需要进行 n-1 轮比较

2、第 m 轮,需要 n-m-1 次比较

根据上述思想,使用 python 代码来实现:

  1. l = [1, 7, 5, 6, 2, 8, 3, 9, 4]

  2. n = len(l)

  3. for m in range(n-1): # 外层循环决定需要排序的轮次

  4. for i in range(n-m-1): # 内层循环决定要比较的次数

  5. if l[i] > l[i+1]:

  6. l[i], l[i+1] = l[i+1], l[i]

  7.     print(l)

输出结果:

  1. [1, 5, 6, 2, 7, 3, 8, 4, 9]

  2. [1, 5, 2, 6, 3, 7, 4, 8, 9]

  3. [1, 2, 5, 3, 6, 4, 7, 8, 9]

  4. [1, 2, 3, 5, 4, 6, 7, 8, 9]

  5. [1, 2, 3, 4, 5, 6, 7, 8, 9] # 到这里其实已经排序结束了

  6. [1, 2, 3, 4, 5, 6, 7, 8, 9]

  7. [1, 2, 3, 4, 5, 6, 7, 8, 9]

  8. [1, 2, 3, 4, 5, 6, 7, 8, 9]

可以看到:循环进行了 5 次就得到了正确的结果,但是程序还是进行了剩下的循环。对上面的程序进行优化,得到下面的改进版。​​​​​​​

  1. l = [1, 7, 5, 6, 2, 8, 3, 9, 4]

  2. n = len(l)

  3. for m in range(n-1):

  4. flag = True # 设置一个标志位

  5. for i in range(n-m-1):

  6. if l[i] > l[i+1]:

  7. l[i], l[i+1] = l[i+1], l[i]

  8. flag = False # 如果本能循环还需要交换就改变flag的值

  9. if flag: # 如果flag没有改变就说明排序成功了

  10. break

  11.     print(l)

运行结果:​​​​​​​

  1. [1, 5, 6, 2, 7, 3, 8, 4, 9]

  2. [1, 5, 2, 6, 3, 7, 4, 8, 9]

  3. [1, 2, 5, 3, 6, 4, 7, 8, 9]

  4. [1, 2, 3, 5, 4, 6, 7, 8, 9]

  5. [1, 2, 3, 4, 5, 6, 7, 8, 9]

分析总结


1. 时间复杂度
  • 若列表的初始状态是正序的,一趟扫描即可完成排序。所需的比较次数 C 和移动次数 M 均为最小值:
    C=n-1,M=0,所以冒泡排序的最好时间复杂度为 O(n)

  • 若列表的初始状态是反序的,需要进行 n-1 趟排序。每趟排序要进行 n-i 次比较,且每次比较都必须移动记录 2 次来达到交换记录的位置。在这种情况下比较和移动次数均达到最大值
    C = n(n-1)/2=O(n2),M=2n(n-1)/2=O(n2)
    冒泡排序的最坏时间复杂度为 O(n2)
    综上,冒泡排序的平均时间复杂度为 O(n2)

2. 空间复杂度

冒泡排序算法过程中内存空间稳定,所以空间复杂度为 O(1)

3. 稳定性分析

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。

所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

4. 应用分析

因为冒泡排序的时间复杂度为 O(n2),一般应用于小规模数据的排序。且冒泡排序逻辑比较简单,易于理解,一般会用于教学。

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java冒泡排序是一种简单排序算法,它重复地遍历待排序的元素,并比较相邻两个元素的大小。如果顺序不正确,就交换它们的位置,直到整个序列按照升序排列为止。实现原理如下: 1. 首先,遍历待排序数组,从第一个元素开始,比较相邻的两个元素大小。 2. 如果前一个元素大于后一个元素,则交换它们的位置。 3. 继续比较下一个相邻元素,重复步骤2,直到遍历完一轮。 4. 重复步骤2和3,直到没有需要交换位置的元素,即数组已经按照升序排列。 冒泡排序的核心思想是通过不断地比较和交换相邻元素,将最大(或最小)的元素逐步“浮”到序列的末尾。每一轮排序都会确定一个最大(或最小)的元素的位置,因此需要进行n-1轮排序,其中n是数组中元素的个数。 以下是一个使用Java实现冒泡排序的示例代码: ```java public class BubbleSort { public static void main(String[] args) { int[] array = {5, 3, 8, 4, 2}; System.out.println("排序前:"); printArray(array); bubbleSort(array); System.out.println("排序后:"); printArray(array); } public static void bubbleSort(int[] array) { int n = array.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (array[j] > array[j + 1]) { // 交换相邻元素的位置 int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } } public static void printArray(int[] array) { for (int num : array) { System.out.print(num + " "); } System.out.println(); } } ``` 以上代码首先定义了一个数组,然后调用`bubbleSort`方法进行冒泡排序,最后输出排序结果。`bubbleSort`方法中使用两层循环,分别遍历数组并比较相邻元素的大小,根据需要交换位置。最后,通过打印数组元素的方法`printArray`输出排序后的结果。 希望以上解答能满足您的需求,如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值