1、选择排序法
def func(li):
for i in range(len(li)-1):
for j in range(i+1,len(li)):
if li[i]>=li[j]:
li[i],li[j]=li[j],li[i]
return li
2、冒泡排序法
def func(li):
for i in range(len(li)-1):
for j in range(len(li)-1-i):
if li[j]>=li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
return li
3、快速排序法
def quick_sort(li):
if len(li)<2:
return li
mid=li[(len(li)-1)//2]
left,right=[],[]
li.remove(mid)
for i in li:
if i>=mid:
right.append(i)
else:
left.append(i)
return quick_sort(left)+[mid]+quick_sort(right)
一行代码实现快排
quick_sort=lambda li:li if len(li)<2 else quick_sort([item for item in li[1:] if item<=li[0]])+[li[0]]+quick_sort([item for item in li[1:] if item>=li[0]])
4、归并排序法
def merge_sort(li):
if len(li)<2:
return li
mid=len(li)//2
left=li[:mid]
right=li[mid:]
return merge(merge_sort(left),merge_sort(right))
def merge(left,right):
result=[]
while len(left)>0 and len(right)>0:
if left[0]<=right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
result+=left
result+=right
return result
li=[1,5,2,0,8,7,6,3]
print(merge_sort(li))
5、堆排序法
# 构造最大堆
def max_heap(li,root_index, end_index):
# 减1是因为堆的下标从1开始,节点i存在子节点,左子节点的索引必定为2*i
max_child_index = root_index * 2 - 1
# 在该树有俩个子节点的情况下,将俩个子节点比较大小
if max_child_index + 1 < end_index:
if li[max_child_index + 1] > li[max_child_index]:
max_child_index += 1
# 将最大的子节点与根节点做比较
if li[max_child_index] > li[root_index - 1]:
li[max_child_index], li[root_index - 1] = li[root_index - 1], li[max_child_index]
def heap_sort(li):
#循环构造最大堆,然后将根节点与末节点调换
for end_index in range(len(li),1,-1):
#每次要构造的最大堆大小与末节点有关
max_root_index = end_index//2
#构造一个最大堆
for root_index in range(max_root_index,0,-1):
max_heap(li,root_index,end_index)
#将最大堆的根节点与末节点调换
li[0],li[end_index-1]=li[end_index-1],li[0]
a = [1,28,5,3,7,4,5,3,6,2,0]
heap_sort(a)
print(a)
欧克