冒泡排序
- 冒泡排序的算法思路在于对无序表进行多趟比较交换;
- 每次包括两两相邻比较,并将逆序数据位置互换;
- 经过n-1次比较交换,实现整表排序;每次过程类似气泡浮出水面。
def bubble_Sort(alist):
n = len(alist)
for passnum in range(n-1,0,-1):
for j in range(passnum):
if alist[j] > alist[j+1]:
alist[j], alist[j+1] = alist[j+1], alist[j]
return alist
alist = [54,2,1,77,100,15,12,18]
print(bubble_Sort(alist))
输出结果:
[1, 2, 12, 15, 18, 54, 77, 100]
比对次数和交换次数时间复杂度:O(n^2);
冒泡排序算法时间效率最差,到那时有一点优势,就是无需任何额外的存储空间开销。
冒泡排序性能改进
- 通过检测每轮比对是否发生交换,可以提前确定排序是否完成;
- 如果某轮比对没有发生数据交换,说明列表已经排好序,可以提前结束算法。
def short_bubble_Sort(alist):
exchanges = True
passnum = len(alist) - 1
while passnum > 0:
exchanges = False
for i in range(passnum):
if alist[i] > alist[i+1]:
exchanges = True
alist[i], alist[i+1] = alist[i+1], alist[i]
passnum = passnum - 1
return alist
test_list = [10,20,30,80,60,50,100,120]
print(short_bubble_Sort(test_list))
输出结果:
[10, 20, 30, 50, 60, 80, 100, 120]
选择排序
- 选择排序对冒泡排序进行了改进,保留了多轮比对思路;
- 相对冒泡排序,选择排序仅进行1次交换,记录最大项所在位置,最后再跟本轮最后一项交换;
- 选择排序算法时间复杂度:
比对次数不变,O(n);
交换次数减少为O(n)。
def selection_Sort(alist):
n = len(alist)
for i in range(n):
min_index = i
for j in range(i+1,n):
if alist[min_index] > alist[j]:
min_index = j
alist[min_index], alist[i] = alist[i], alist[min_index]
return alist
test_list = [54,2,1,77,100,15,12,18]
print(selection_Sort(test_list))
输出:
[1, 2, 12, 15, 18, 54, 77, 100]