冒泡排序及其优化-排序算法连载(一)

冒泡排序,是最经典的排序算法。下面从以下几个方面介绍该算法。

  • 算法原理[algorithm principle]
  • 算法实现[algorithm implementation]
  • 时间复杂度[time complexity]
  • 空间复杂度[space complexity]
  • 稳定性[stability]
  • 算法优化[Algorithm optimization]

1.算法原理

就像他的名字一样,就是像气泡一样的,从数组的底部互相交换数值,保证大数值在上。下面举个例子。
如有数组 array=[1,3,2,7,9,5]
在这里插入图片描述
下面进行第一次循环
从开始位置判断两个相邻位置大小,保证 array[j]<array[j+1]
在这里插入图片描述=
满足 array[j]<array[j+1],不用进行交换。
在这里插入图片描述
由于3>2 所以进行交换,交换后,继续向下移动。
在这里插入图片描述
满足 array[j]<array[j+1],不用进行交换。
在这里插入图片描述
由于9>7 所以进行交换,交换后,继续向下移动。
在这里插入图片描述
由于9>5 所以进行交换,完成第一轮循环,将最大值9设置为灰色。
在这里插入图片描述
到此第一轮循环就完成了。代码描述如下。

0到(数组长度-外侧循环数-1 )#此时外侧循环为0(第一次循环外层循环数为0 ,因为数组从0开始)
      如果 a[j]>a[j+1]  交换  a[j]>a[j+1] 
      否则 不做操作

下面进行第二次循环

在这里插入图片描述
满足 array[j]<array[j+1],不用进行交换。
在这里插入图片描述
满足 array[j]<array[j+1],不用进行交换。
在这里插入图片描述
满足 array[j]<array[j+1],不用进行交换。
在这里插入图片描述7
由于7>5 所以进行交换,将7置为灰色,第二次循环结束。
在这里插入图片描述
到此第二轮循环就完成了。代码描述如下。

0 到数组长度-2, 循环:#由于9已经不用在比较,可以减少一次
      如果 a[j]>a[j+1]  交换  a[j]>a[j+1] 
      否则 不做操作

下面进行第三次循环。(聪明的观众已经发现了,这个数组已经有序了,但是还是要继续循环。)
在这里插入图片描述
满足 array[j]<array[j+1],不用进行交换。
在这里插入图片描述
满足 array[j]<array[j+1],不用进行交换。
以此类推,我们就可以,这样…

在这里插入图片描述我们就得到如下数组。
在这里插入图片描述
代码描述为

外层循环:从0(数组长度-1)#表示循环次数
	内层循环:从0到(数组长度-外侧循环数-1)	
		      如果 a[j]>a[j+1]  交换  a[j]>a[j+1] 
     		  否则 不做操作

2. 算法实现

使用语言-python

def bubblesort(nums):
	length=len(nums)
	for i in range(length):
		for j in range(0,length-i-1):
			if nums[j]>nums[j+1]:
				nums[j+1],nums[j]=nums[j],nums[j+1]#交换两个值
				'''
				#也可以写成经典交换方式
				temp=nums[j]
				nums[j]=nums[j+1]
				nums[j+1]=temp
				#或者使用异或交换
				nums[j+1]=nums[j+1]^nums[j]
				nums[j]=nums[j+1]^nums[j]
				nums[j+1]=nums[j+1]^nums[j]
				'''
	print(nums)

3.时间复杂度

外层循环:从0到(数组长度-1):#表示循环次数
内层循环:从0到(数组长度-外侧循环数-1)
如果 a[j]>a[j+1] 交换 a[j]>a[j+1]
否则 不做操作

首次循环n-1
下一次 n-2

根据通项公式有T
T = n − 1 + n − 2 + n − 3 + . . . + 1 = n ( n − 1 + 1 ) 2 = n 2 2 T=n-1+n-2+n-3+...+1=\frac {n(n-1+1)}{2}=\frac {n^2}{2} T=n1+n2+n3+...+1=2n(n1+1)=2n2
所以时间复杂度为
O ( T ) = O ( 1 2 n 2 ) O(T)=O(\frac{1}{2} n^2) O(T)=O(21n2)

4.空间复杂度

冒泡排序是原地排序的一种排序,所以空间复杂度为O(1)

原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。

5.稳定性

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。–百度百科

在这里插入图片描述
冒泡排序是相邻的两个元素比较,交换也发生在这两个元素之间。如果两个元素相等,不用进行交换,所以排序前后相同元素的前后位置不会发生变化 ,所以冒泡排序是一种稳定排序算法。

6. 算法优化

还是以上述数组为例
在这里插入图片描述

当进行两次循环之后
在这里插入图片描述
明显排序已经结束了,但是循环还没有结束,还是会继续执行,这无疑是徒劳的。这是我们优化的出发点。
我们可以设置一个标记,如果一次循环内,没有发生交换,则结束循环。

def bubblesort2(nums):
	length=len(nums)
	for i in range(length):
		flag=0#每次循环,将flag 设置为0 
		for j in range(0,length-i-1):
			if nums[j+1]<nums[j]:
				flag=1#如果发生交换,将flag 设置为1 
				nums[j+1],nums[j]=nums[j],nums[j+1]
		if flag==0:	break #若flag 还是0 表示未发生交换
	print(nums)

到此结束 打完收工。

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值