一、冒泡排序(Bubble Sort)
1.1 算法思路
在于对无序表进行多趟比较交换,每趟包括了多次两两相邻比较, 并将逆序的数据项互换位置, 最终能将本趟的最大项就位,经过n-1趟比较交换, 实现整表排序,每趟的过程类似于“气泡”在水中不断上浮到水面的经过。
【步骤】
- 第1趟比较交换, 共有n-1对相邻数据进行比较
一旦经过最大项,则最大项会一路交换到达最后一项 - 第2趟比较交换时, 最大项已经就位, 需要排序的数据减少为n-1, 共有n-2对相邻数据进行比较
- 直到第n-1趟完成后, 最小项一定在列表首位, 就无需再处理了。
1.2 代码及复杂度分析
【代码】
def bubbleSort(alist):
for pos in range(len(alist)-1, 0, -1): #-1表示向前步进
for i in range(pos):
if alist[i] > alist[i+1]:
alist[i],alist[i+1]=alist[i+1],alist[i] #python支持直接交换
alist = [23, 45, 12, 2, 23, 89, 54, 35]
bubbleSort(alist)
print(alist)
- 算法过程总需要n-1趟, 随着趟数的增加, 比对次数逐步从n-1减少到1, 并包括可能发生的数据项交换。
- 比对的时间复杂度是 O ( n 2 ) O(n^2) O(n2)
- 冒泡排序通常作为时间效率较差的排序算法, 来作为其它算法的对比基准。
- 但有一点优势, 就是无需任何额外的存储空间开销。
- 另外, 通过监测每趟比对是否发生过交换, 可以提前确定排序是否完成
二、选择排序
2.1 算法思路及复杂度分析
- 选择排序对冒泡排序进行了改进, 保留了其基本的多趟比对思路, 每趟都使当前最大项就位。
- 但选择排序对交换进行了削减, 相比起冒泡排序进行多次交换, 每趟仅进行1次交换, 记录最大项的所在位置, 最后再跟本趟最后一项交换
【步骤】
- 从待排序的数据元素中选出最大的一个元素,存放在序列的末尾位置
- 再从剩余的未排序元素中寻找到最大元素,然后放到已排序的序列的首段
或 - 从待排序的数据元素中选出最小的一个元素,存放在序列的首段位置
- 再从剩余的未排序元素中寻找到最小元素,然后放到已排序的序列的尾部
图为第二种情况:
【代码】
def selectionSort(alist):
for pos in range(len(alist)-1, 0, -1):
posofMax = 0
for loc in range(1, pos+1): #找出最大值
if alist[loc] > alist[posofMax]:
posofMax = loc
alist[pos],alist[posofMax]=alist[posofMax],alist[pos] #将最大值往后排