冒泡排序
一、定义
冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换的元素,也就是说该数列已经排序完成。
二、用python实现冒泡排序
冒泡排序原理
最大值是通过对列表中的元素进行两两比较,边比较边交换,使得值大的元素逐步向后移动。也即是说每次对相邻的两个元素进行比较,若前者大于后者则进行交换,如此一趟下来最后一个就是最大元素,除了后面已经确定下来的元素,重复以上的步骤。
演示如下:
python实现
def BubbleSort(alist):
#求序列长度
n = len(alist)
# 外层循环,控制比较的趟数(有n个元素,需要比较n-1趟)
for i in range(n):
# 内层循环依此进行两两比较,第i趟时,说明尾部的i个元素已经确定,序列中未排序的元素个数为 len(alist)-i-1 个,j的范围是[0,n-i-1)
for j in range(n-i-1):
# 如果前者大于后者则交换
if alist[j]>alist[j+1]:
alist[j],alist[j+1] = alist[j+1],alist[j]
#结束返回排好序的列表
return alist
BubbleSort([50,20,40,8,28])
[8, 20, 28, 40, 50]
算法优化
最坏情况下,待比较序列多长就要进行多少趟,而且每趟排序都要比较判断;
但是观察上述例子,通常情况下,当里面的一层循环在某次扫描中没有交换则说明此时数组已经全部有序,无需再次扫描。
所以可以添加一个标记count,每交换一次就进行对count+1,如果某一趟排序结束后count等于0,说明序列已经有序了,排序完成,可直接退出。
def BubbleSort_pri(alist):
n = len(alist)
# 外层循环,控制比较的趟数(有n个元素,需要比较n-1趟)
for i in range(n):
# 内层循环依此进行两两比较,第i趟时,说明尾部的i个元素已经确定,序列中未排序的元素个数为 len(alist)-i-1 个,j的范围是[0,n-i-1)
for j in range(n-i-1):
# count 值用于记录每次冒泡比较时交换的次数
count = 0
# 如果前者大于后者则交换
if alist[j]>alist[j+1]:
alist[j],alist[j+1] = alist[j+1],alist[j]
count += 1
# 每趟冒泡结束时判断count,如果发现本趟冒泡比较中没有交换,说明前面的已经有序,直接退出
if 0 == count:
return alist
a = [1,34,7,43,8,45,93,89]
print("原始序列",a)
print("排序后",BubbleSort_pri(a))
原始序列 [1, 34, 7, 43, 8, 45, 93, 89]
排序后 [1, 7, 8, 34, 43, 45, 89, 93]