用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个元素的比较和交换, 排序完成
形象理解:这种算法就如同水底的泡泡向上升一样,不断把最大的元素放到末端
二、例程:
注:
1. 由于Python中,list的第一个元素编号为0,所以上面算法描述中的第一个对应为例程中的[0], N-1对应为[N-2]
2.下面是很经典的交换两个值的方法,
a, b = b, a
三、改进后的冒泡排序
由上可知,冒泡排序是一种很直观的排序法,同时也是一种很罗嗦的方法,因为每一轮都要重复比较相邻元素的大小。“存在问题的地方就是可以改进的地方”——经过分析可以发现,如果一旦在某一轮,没有发生任何交换,则此时就可以结束了。
为了实现这种思想,外层循环就得改成while加Flag的方式了,例程如下:
四、测试
如果有兴趣,可以把上述两段程序中print语句前面的#去掉,再运行下面的测试程序,就可以比较两种算法循环次数的区别了:
(以从小到大排序为例,假设共计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)
相关文章推荐
- 【python】python实现栈
- python安装第三方库gevent
- subprocessing在python中的应用
- python_学习笔记0825
- python pickle函数应用
- 笔记python函数,python学习网址
- 轻松python文本专题-去掉字符串前后空格
- 轻松python文本专题-去掉字符串前后空格
- Eclipse环境下的Python编程
- Python源码分析2 - 一个简单的Python程序的执行
- python @property
- 轻松python文本专题-字符串对齐
- 轻松python文本专题-字符串对齐
- 【python】python读写excel
- python习题练习(chapater 5 -- python核心编程)
- Numpy Python 使用感想
- python--利用有道网址编写一个翻译句子的程序
- python 问题
- Python eval()函数
- Python属性、方法和类管理系列之----描述符类