您的位置:首页 > 编程语言 > Python开发

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

2015-08-25 23:06 627 查看
一、冒泡排序的核心思想

(以从小到大排序为例,假设共计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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: