稳定性定义:相同的值在排序结束之后的相对次序不变。
1. 冒泡排序
每一轮相邻两个值之间比较,大小顺序相反的交换位置,最后的值总是最大。
稳定性:稳定
def BubbleSort(alist):
"""冒泡排序 """
#最坏时间复杂度= O(n^2)
#用count控制如某一层从头到尾的比较中没有做任何交换,说明顺序已经正确,不用继续比,可使最优复杂度变为 O(n)
n = len(alist)
for i in range(n-1) # 外层控制一共走多少次
count = 0
for j in range(n-1-i):
# 内层控制从头走到尾
if alist[j] > alist[j+1]:#因为没有等号,所以相邻值相等时不改变次序,是稳定的算法
alist[j],alist[j+1] = alist[j+1],alist[j]
count += 1
if count == 0:
return
if __name__ == "__main__":
li = [32,54,12,45,23,13,67,12,43]
print(li)
BubbleSort(li)
print(li)
2. 选择排序
思路:认为左边有序右边无序。将右边无序的数值中找到最小的,第二小的依次与左边的交换位置。
稳定性:考虑从小到大排列,第一个元素是10,被最小值调换之后就排到列表中的10后面.所以不稳定
def SelectSort(alist):
"""选择排序""" # 最优和最坏时间复杂度都是O(n^2) 不稳定
n = len(alist)
for i in range(n-1):
min_index = i
for j in range(i+1,n):
if alist[j] < alist[min_index]:
min_index = j
alist[i],alist[min_index] = alist[min_index],alist[i]
if __name__ == "__main__":
li = [32,54,12,45,23,13,67,12,43]
print(li)
SelectSort(li)
print(li)
3. 插入排序
假设左边有序,右边无序。
先拿出第一个元素,每一轮将右边剩下的元素与左边比较,依次往前挪直到前面一个比他小
- 最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)
- 最坏时间复杂度:O(n^2) (升序排列,序列处于降序状态)
- 稳定性:稳定
# def InsertSort(alist):
# n = len(alist)
# for i in range(1,n):
# j = i # j代表内层循环起始值
# while j > 0:
# if alist[j] < alist[j-1]:
# alist[j],alist[j-1] = alist[j-1],alist[j]
# j -= 1
# else:
# break
""" 等价2个for循环:"""
def InsertSort(alist):
n