冒泡排序(相邻两数比较):
稳定
平均/最好/最坏时间复杂度:O(n2)/O(n)/O(n2)
1.列表长度为N,遍历n-1次,每相邻两个数比较,如果前面大,则交换这两个数
2.每一趟之后,最大的数会被放到最后。无序区-1,有序区+1
注意:多少趟,无序区的范围,不再进行交换时的优化
def bubble_sort(list):
n=len(list)
for i in range(n-1): #需要n-1趟
flag = False
for j in range(0,n-i-1): #每一趟比较n-i-1次,括号内前闭后开
if list[j]>list[j+1]: #比较相邻两个数大小
list[j],list[j+1]=list[j+1],list[j] #前大后小就倒腾一下
flag = True
#print(list)
if not flag: #不换了就不比了,大小顺序捋好了
break
选择排序(找最小值索引)
不稳定
平均/最好/最坏:O(n2)/O(n2)/O(n2)
长度为N的数组,遍历n-1次,找出每一趟最小值,放到当下无序区第一个位置
注意:遍历次数;如何通过比较找到无序区最小值(定义第一个为最小值的位置,比较之后倒腾);无序区的长度;
def select_sort_test(list):
n=len(list)
for i in range(n-1): #比较n-1次
min=i #先将无序区第一个位置假定为最小数的索引用于比较
for j in range(i+1,n): #无序区范围,遍历无序区找最小值
if list[j]<list[min]: #比较后面的数和无序区第一个位置的大小
min=j #这一层遍历就是在找无序区最小的值的索引
list[min],list[i]=list[i],list[min] #将一趟的最小值放到头上
插入排序(一步一步找坑位)
稳定
平均/最好/最坏:O(n2)/O(n)/O(n2)
有序区先放一个,从无序区摸牌比较,插入有序区
注意:将拿到的牌与有序区比较时,应该放到哪个位置,范围是什么
def insert_sort_test(list):
n=len(list)
for i in range(1,n): #从无序区摸牌,i
tmp=list[i] #存一下摸到的牌值
j=i-1 #j表示手中有序区的牌的位置,从无序区前一个开始比较
while j>=0 and tmp<list[j]: #找到刚好比手中牌大的位置或者最开头
list[j+1]=list[j] #比j位置上的小,就把j上的位置往后挪一个腾空
j-=1 #再与往前一个位置的牌作比较
list[j+1]=tmp #找到坑位后插下牌
明天看快排,冲冲冲