冒泡排序: 左右比较互换 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)