li=[3,4,2,1,5,7,8,9,6]definsert_sort(li):for i inrange(1,len(li)):#i表示摸到的牌的下标
tmp=li[i]
j=i-1#j表示手里牌的下标while j>=0and li[j]>tmp:#手里有牌并且手里的牌比摸到的牌大
li[j+1]=li[j]
j-=1
li[j+1]=tmp
print(li)#复杂度O(n^2)
insert_sort(li)
li
#结果[3,4,2,1,5,7,8,9,6][2,3,4,1,5,7,8,9,6][1,2,3,4,5,7,8,9,6][1,2,3,4,5,7,8,9,6][1,2,3,4,5,7,8,9,6][1,2,3,4,5,7,8,9,6][1,2,3,4,5,7,8,9,6][1,2,3,4,5,6,7,8,9][1,2,3,4,5,6,7,8,9]
2.4 快速排序
defpartition(li,left,right):
tmp=li[left]while left<right:while left<right and li[right]>=tmp:#从右侧找出比tmp小的数
right-=1#左移
li[left]=li[right]#把右侧的数写到左边空位上while left<right and li[left]<=tmp:#从左侧找出比tmp大的数
left+=1
li[right]=li[left]#把左侧的数写到右边空位上
li[left]=tmp #tmp归位return left
defquick_sort(li,left,right):if left<=right:
mid=partition(li,left,right)
quick_sort(li,left,mid-1)
quick_sort(li,mid+1,right)
li=[3,4,2,1,5,7,8,9,6]
quick_sort(li,0,len(li)-1)print(li)#结果[1,2,3,4,5,6,7,8,9]
时间复杂度:如下图所示,对于长度为16的列表,每次按照left和right进行左右分组,理想情况下,分组后的元素个数减半,即需要分4层(
4
=
log
2
16
4=\log_2 16
4=log216),此时的复杂度为
l
o
g
n
logn
logn,每次分组后都需要遍历所有元素,即时间复杂度为
n
n
n,综上时间复杂度为:
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)