冒泡排序: 左右比较互换
def select_sort(li):
lg=len(li)-1
for i in range(lg):
flag = False
for j in range(lg):
if li[j] > li[j+1]:
li[j+1],li[j] = li[j],li[j+1]
flag = True
if not flag:
return
select_sort(li)
print(li)
选择排序 每次循环取最左边的为最小值去比较
def select_sort(li):
lg = len(li)-1
for i in range(lg):
emp = i
for j in range(i+1,lg+1):
if li[j] <= li[emp]:
emp = j
if emp != i:
li[i],li[emp] = li[emp],li[i]
select_sort(li)
print(li)
插入排序 原始列表里分为有序和无序,每次从无序区里拿一个元素插入到有序区里
def select_sort(li):
lg = len(li)-1
for i in range(1,lg):
tmp = li[i]
j = i-1
while j>= 0 and tmp<li[j]:
li[j+1] = li[j]
j = j-1
li[j+1] = tmp
select_sort(li)
print(li)
快排 取一个元素p,使其归位,左边的比起小,最右边的比其大,递归完成排序
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)
def partition(li,left,right):
tmp = li[left]
while left<right:
while li[right] >= tmp and left<right:
right -= 1
li[left] = li[right]
while li[left] <= tmp and left<right:
left+= 1
li[right] = li[left]
li[left] = tmp
return left
quick_sort(li,0,len(li)-1)
print(li)
归并排序 先分组为有序的单个列表,在合并(依赖另外一个列表实现),与中间的索引比较
def merget_sort(li,left,right):
if left < right:
mid = (left+right) // 2
merget_sort(li,left,mid)
merget_sort(li,mid+1,right)
merget(li,left,mid,right)
def merget(li,left,mid,right):
i = left
j = mid+1
ltmp = []
while i <= mid and j <= right:
if li[i] <= li[j]:
ltmp.append(li[i])
i+=1
else:
ltmp.append(li[j])
j += 1
# 右边没值了
while i <= mid:
ltmp.append(li[i])
i+=1
# 左边没值 了
while j<= right:
ltmp.append(li[j])
j+=1
# 重新赋值给列表
li[left:right+1] = ltmp
merget_sort(li,0,len(li)-1)
print(li)
计数排序 很妙,去其索引给另外的列表,在取出来给自身
def count_sort(li,max_num):
count = [0 for i in range(max_num+1)]
for num in li:
count[num] += 1
i = 0
for num, m in enumerate(count):
for j in range(m):
li[i] = num
i += 1
count_sort(li,max(li))
print(li)