冒泡排序
#冒泡排序 时间复杂度O(n2)
@cal_time
def bubble_sort(li):
for i in range(len(li)-1):
exchange =False
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
exchange=True
if not exchange:
return
li=[random.randint(1,10000) for i in range(10)]
print(li)
bubble_sort(li)
print(li)
#选择排序 复杂度O(n2)
#一趟排序记录最小的数,放到第一个位置
#在一趟排序记录 记录无序区最小的数,放到第二个位置
#关键点:有序区和无序区,无序区最小数的位置
def select_sort(li):
for i in range(len(li)-1):#i是第几趟
min_loc=i
for j in range(i+1,len(li)):
if li[j] < li[min_loc]:
min_loc = j
li[min_loc],li[i]=li[i],li[min_loc]
li = [3,5,4,1,2,7,6,8,9]
select_sort(li)
print(li)
#插入排序 复杂度O(n2)
def insert_sort(li):
for i in range(1,len(li)): #i表示摸到的排的下标
tmp=li[i]
j=i-1 #j指的是手里的牌的下标
while li[j]>tmp and j>=0:
li[j+1] = li[j]
j=j-1
li[j+1] = tmp
li=list(range(10))
print(li)
random.shuffle(li)
print(li)
insert_sort(li)
print(li)
#快速排序
def partition(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:
left += 1
li[right] = li[left] #把右边的值写到左边空位上
li[left]=tmp #把temp归位
return left
def quick_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=[5,7,4,6,3,1,2,9,8]
quick_sort(li,0,len(li)-1)
print(li)
学习自哔哩哔哩https://www.bilibili.com/video/BV1UK41137q7?spm_id_from=333.999.0.0