# 冒泡排序,复杂度为O(n^2)
def bubble_sorted(li:list)->list:for i in range(len(li)):# 第几趟exchanged = False# 这个是为了防止多余的遍历,如果前面的元素已经是排序好的,那就不需要再进行比较了,减少运行时间for j in range(len(li)-1):# 遍历列表元素if li[j] > li[j+1]:li[j],li[j+1] = li[j+1],li[j]exchanged = Trueif not exchanged:return li# 选择排序,复杂度为O(n^2),思路是遍历一趟元素后,选择最小的值放在无序区的第一位
def select_sorted(li:list)->list:for i in range(len(li)):min_loc = i# 初始化最小值的位置为第一个for j in range(i+1,len(li)-1):if li[j]<li[min_loc]:li[j],li[min_loc] = li[min_loc],li[j]# 交换元素return li# 插入排序,复杂度为O(n^2),思路是从左到右抽取一个元素,将这个元素,与左边邻近的元素比较,若比左边的小,则左边元素右移,
# 若不比左边的小了或者已经到最左边了,则将抽取的元素赋值给原本左边元素
def insert_sorted(li:list)->list:for i in range(1,len(li)):# 趟数,也就是抽牌的顺序,从第一张牌开始抽tmp = li[i]j = i - 1# 左边元素while j >= 0 and li[i] < li[j]:# 若抽取的元素小于邻近左边的元素,则将左边元素右移一格li[j+1] = li[j]j -= 1# 这时候的j已经不满足上述条件了,因此这个j位置上的元素没有移动,而j+1上位置的元素移动了是空的li[j+1] = tmpreturn lidef insert1_sorted(li:list)->list:for i in range(1,len(li)):# 趟数,也就是抽牌的顺序,从第一张牌开始抽tmp = li[i]for j in range(i - 1,1):if li[i] < li[j] and (li[i] > li[j - 1]):li[j+1] = li[j]li[j] = tmpreturn liif __name__ == '__main__':li = [9,3,7,1,4,2,5,8]print(bubble_sorted(li))print(select_sorted(li))print(insert_sorted(li))print(insert1_sorted(li))