用Python实现基本排序算法01——冒泡排序

15 篇文章 0 订阅
12 篇文章 0 订阅

一、冒泡排序的核心思想

(以从小到大排序为例,假设共计N个元素):

1.1 从第一个元素开始,将其与下一个元素相比较,如果前一个元素大于后一个元素,则将两者进行交换。

1.2 重复1.1,直到完成N-1元素和N元素的比较(和交换)

      即经过N-1次的比较和最多N-1次的交换,就可以将最大的元素交换到最末的位置

2   从第一个元素开始,直到完成N-2与N-1元素的比较(和交换)

     即经过N-2次比较和最到N-2次交换,就可以将第二大元素放到其应在的位置

......

N-1. 完成N-(N-1)和N-(N-2),即第1和第2个元素的比较和交换, 排序完成


形象理解:这种算法就如同水底的泡泡向上升一样,不断把最大的元素放到末端


二、例程:

def bubbleSort(alist):
	n=len(alist) # n为元素个数

	for i in range(n-1): # i=(0,1,2,...n-2),即共计循环n-1次
		for j in range(n-i-1): # j=(0,1,2...n-i-2),注意range(1)=[0], range(0)=[]
			if alist[j]>alist[j+1]:
				tmp=alist[j]
				alist[j]=alist[j+1]
				alist[j+1]=tmp
		#print alist  #动态显示每一次循环后,将一个比较大的元素移到最后的过程

注:

1. 由于Python中,list的第一个元素编号为0,所以上面算法描述中的第一个对应为例程中的[0], N-1对应为[N-2]

2.下面是很经典的交换两个值的方法,

tmp=alist[j]
alist[j]=alist[j+1]
alist[j+1]=tmp
其实 在Python中,这些语句其实可以很简单地写成:

a, b = b, a

三、改进后的冒泡排序

由上可知,冒泡排序是一种很直观的排序法,同时也是一种很罗嗦的方法,因为每一轮都要重复比较相邻元素的大小。“存在问题的地方就是可以改进的地方”——经过分析可以发现,如果一旦在某一轮,没有发生任何交换,则此时就可以结束了。

为了实现这种思想,外层循环就得改成while加Flag的方式了,例程如下:

def bubbleSortOpt(alist):
	n=len(alist) # n为元素个数
	continueFlag=True
	i=0

	while i<n-1 and continueFlag:  #最多循环n-2次,若Flag变化,则直接结束
		continueFlag=False 
		for j in range(n-i-1): # j=(0,1,2...n-i-2)
			if alist[j]>alist[j+1]:
				alist[j],alist[j+1]=alist[j+1], alist[j]
				continueFlag=True #如果发生了交换,则还需要继续走循环,如果没有发生,上面的False就会结束循环
		#print alist  #动态显示每一次循环后,将一个比较大的元素移到最后

四、测试

如果有兴趣,可以把上述两段程序中print语句前面的#去掉,再运行下面的测试程序,就可以比较两种算法循环次数的区别了:

list1=[9,8,3,4,6,0,2,1,7,5]
list1Copy=[9,8,3,4,6,0,2,1,7,5]

print list1
bubbleSort(list1)

print '++++++++++\n'
print list1Copy
bubbleSortOpt(list1Copy)



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值