【学习分享】小白写算法之冒泡排序篇

本文介绍了冒泡排序算法的工作原理,通过C语言示例展示了其实现过程,详细计算了时间复杂度(O(n^2))和空间复杂度(O(1)),并强调了该算法的稳定性。
摘要由CSDN通过智能技术生成


前言

最近我要学习下数据结构和算法,有兴趣的小伙伴可以点个关注,一起学习。争取写的浅显易懂。如果你看不懂,那一定是我没学到位。


一、什么是冒泡排序算法

冒泡排序,英文bubblesort,是很容易理解的一种排序方式。想象一下泡泡从水底按顺序冒出就有画面了。
在这里插入图片描述
比如原来有一组6位数序列{4,5,6,3,1,2}
按顺序依次从小到大排列,下面的动图演示了冒泡排序算法。
在这里插入图片描述


二、冒泡排序算法如何实现

那么如何实现冒泡排序算法呢?
还是以动图数组{4,5,6,3,1,2}为例,需要执行6轮,每1轮(设为第i轮)要把遍历后最大的数冒泡到第(6-i)的位置。
在这里插入图片描述

然后看看第i轮冒泡排序做了什么

比如第1轮先把最大数6经过前后比较找了出来,然后把最大数6冒泡到第5的位置。
怎么找到最大数6,通过前后比较,所以是先4和5比较,不需要交换。5和6比较,不需要交换。6和3比较,交换。6和1比较,交换。6和2比较,交换。一共交换5次,结束第1轮。后面每1轮都是执行一样的循环逻辑。
在这里插入图片描述

在第i轮的时候,我们用第j位的数和第j+1位的数进行比较,如果第j+1位的数大于第j位的数,那么就互换;否则就不互换,保持原状。

那么关于冒泡排序算法我们已经基本搞清楚了。


三、C语言实现算法

我们设要比较的数组为arr[]
那么用C语言实现冒泡排序算法的代码就可以写出来了。

#include<stdio.h>

void bubblesort(int arr[],int n) //冒泡排序算法
{
   int temp;
    for(int i=0;i<n-1;i++)
        for(int j=0;j<n-i-1;j++)
            if(arr[j]>arr[j+1])  //如果前一个数>后一个数,那么前后两个数互换
		          {
		            temp = arr[j+1]; 
		            arr[j+1] = arr[j];
		            arr[j] = temp;   
		          }
}

void print(int arr[],int n)  //打印数组
{
	for(int i=0;i<n;i++)
		  printf("%d ",arr[i]);
}

int main()
{
    int arr[6] ={4,5,6,3,1,2};

      printf("冒泡排序前的数组为");
  	  print(arr,6);
      bubblesort(arr,6); //调用冒泡算法
      printf("\n冒泡排序后的数组为");
      print(arr,6);
}

用gcc编译并运行可以得到升序的数组序列,符合预期。
在这里插入图片描述


四、复杂度计算

时间复杂度
关于时间复杂度的计算可以看下面这篇文章,浅显易懂。
各位学弟学妹,别再看教材了,时间复杂度看这篇就好了

还是以序列{4,5,6,3,1,2}为例,那么我们一共执行了5+4+3+2+1=15次,推广到n次就是n*(n-1)/2次,那么时间复杂度就是n^2次。
也可以这么理解,c代码中有两个n的嵌套执行语句,那么时间复杂度就是n^2。
记为O(n^2)
在这里插入图片描述
时间复杂度有时候还会考虑最好最坏的情况下的计算,有点超纲了,可以了解下。
冒泡排序最佳情况的时间复杂度,为什么是O(n)
关于最好情况,最坏情况,平均情况复杂度,请参考如下总结文章。
10种排序算法的复杂度,比较,与实现

空间复杂度
关于空间复杂度可以看下面文章
空间复杂度计算超全整理!!(一起手撕复杂度计算)
冒泡排序的空间复杂度怎么计算呢?
在冒泡算法中,我们用到了三个临时变量参数i,j,temp(注意,不是临时的不算在空间复杂度上,所以arr和n不算空间复杂度
在这里插入图片描述

在这里插入图片描述
那就很容易理解了,空间复杂度是O(3),一般都记为O(1)


五、算法稳定性

冒泡排序算法是稳定的吗?首先我们要知道什么是算法稳定性。算法的稳定性是指排序算法在排序过程中能否保持相等的元素的相对顺序。那么很明显冒泡排序在处理两个相同元素的时候是不做处理的,所以冒泡排序算法是稳定的
在这里插入图片描述


六、小结

本文对冒泡排序算法进行了深入浅出的讲解,网上其实有很多大牛写的文章都很不错,都可以相互借鉴学习下。希望大家都能掌握算法真理,码字不易,且行且珍惜~~

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 答案:下面是Python代码实现冒泡排序的示例: def bubbleSort(arr): n = len(arr) # 遍历所有数组元素 for i in range(n): # Last i elements are already in place for j in range(0, n-i-1): # traverse the array from 0 to n-i-1 # Swap if the element found is greater # than the next element if arr[j] > arr[j+1] : arr[j], arr[j+1] = arr[j+1], arr[j] ### 回答2: 冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,比较相邻的两个元素,如果它们的顺序错误就交换位置,直到没有需要交换的元素为止。以下是用Python语言编冒泡排序算法示例: def bubble_sort(arr): n = len(arr) for i in range(n): # 标记是否有交换发生 swapped = False for j in range(0, n - i - 1): # 相邻元素比较,如果顺序错误则交换 if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] swapped = True # 如果没有交换发生,说明已经有序,提前退出循环 if not swapped: break return arr # 测试代码 arr = [64, 34, 25, 12, 22, 11, 90] print("排序前:", arr) print("排序后:", bubble_sort(arr)) 以上代码首先定义了一个名为bubble_sort的函数,接受一个列表参数arr。该函数中使用两个循环嵌套来进行排序操作。外层的循环从0到n-1,表示需要进行n-1次遍历。内层的循环从0到n-i-1,表示每一次遍历需要比较的元素个数,且随着外层循环的进行,内层循环需要比较的元素个数逐次减少。内层循环中,通过比较相邻元素的大小,若顺序错误则进行交换,直到完成整个序列的排序。另外,代码中利用一个变量swapped来标记是否有交换发生,如果某次排序中没有任何元素交换位置,则说明整个序列已经有序,可以提前退出外层循环。 最后通过测试代码对冒泡排序进行验证。将一个未排序的列表作为输入参数传递给bubble_sort函数,并将排序前和排序后的结果进行输出。 ### 回答3: 冒泡排序是一种基本的排序算法,通过比较相邻的元素并交换位置,从而将最大的元素逐步“冒泡”到最后。 要用Python编一个冒泡排序,首先要定义一个函数,接受一个列表作为参数,然后使用两层循环来比较和交换元素。 大致的思路是,外层循环控制总共需要比较和交换的次数,内层循环用来遍历列表并比较相邻的元素。 具体的实现如下: def bubble_sort(lst): n = len(lst) for i in range(n-1): # 外层循环控制需要比较和交换的次数 for j in range(n-i-1): # 内层循环用来遍历列表并比较相邻的元素 if lst[j] > lst[j+1]: # 如果前一个元素大于后一个元素,则交换位置 lst[j], lst[j+1] = lst[j+1], lst[j] return lst 这样,我们就定义好了一个能够实现冒泡排序功能的函数。接下来,我们可以测试一下: test_list = [5, 2, 8, 9, 1, 3, 7] sorted_list = bubble_sort(test_list) print(sorted_list) 输出结果为:[1, 2, 3, 5, 7, 8, 9] 这样,我们就成功地用Python实现了一个冒泡排序算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jason Yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值