# 冒泡排序,复杂度为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 = True
if 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] = tmp
return li
def 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] = tmp
return li
if __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))