快速排序:抽取中间值,对比后将列表分为两个列表,然后不停地分裂,将中间值进行对比,直到只剩最后一个值
# 需要用到递归
def split_lst(lst,left,right):
temp = lst[left]
while left<right:
while lst[right]>=temp and left<right:
right -= 1
lst[left] = lst[right]
while lst[left]<=temp and left<right:
left += 1
lst[right] = lst[left]
lst[right] = temp
return right
def quick_sort(lst,left,right):
if left<right:
index = split_lst(lst,left,right)
quick_sort(lst,left,index)
quick_sort(lst,index+1,right)
return lst
堆排序:建堆(给列表进行逻辑排序)_再进行弹出(按列表的逻辑关系寻找极值)
堆排序,那是相对复杂的,但过程很妙
def sift(lst,root,last):
i = root
j = 2*i+1
tmp = lst[i]
while j<=last:
if j+1<=last and lst[j]>lst[j+1]:
j = j+1
if lst[j]<tmp:
lst[i] = lst[j]
i = j
j = 2*i+1
else:
break
lst[i] = tmp
def heap_sort(lst,root,last):
n = len(lst)
# 建堆
for i in range((n-2)//2,-1,-1):
sift(lst,i,n-1)
# 弹出
for last in range(n-1,-1,-1):
lst[0],lst[last] = lst[last],lst[0]
sift(lst,0,last-1)
return lst
归并排序:递归将列表逐级拆分直至只剩两个元素,然后逐级返回归并排序
def merge(lst,root,mid,last):
i = root
j = mid+1
ltmp = []
while i<=mid and j<=last:
while i<=mid and j<=last and lst[i]<lst[j]:
ltmp.append(lst[i])
i += 1
while i<=mid and j<=last and lst[j]<lst[i]:
ltmp.append(lst[j])
j += 1
while i<=mid:
ltmp.append(lst[i])
i += 1
while j<=last:
ltmp.append(lst[j])
j += 1
lst[root:last+1] = ltmp
def merge_sort(lst,root,last):
if root<last:
mid = (root+last)//2
merge_sort(lst,root,mid)
merge_sort(lst,mid+1,last)
merge(lst,root,mid,last)
return lst
希尔排序
if __name__ == "__main__":
lst = list(range(100))
random.shuffle(lst)
print(insert_sort(lst))
random.shuffle(lst)
print(select_sort(lst))
random.shuffle(lst)
print(quick_sort(lst, 0, 99))
random.shuffle(lst)
print(heap_sort(lst, 0, 99))
random.shuffle(lst)
print(merge_sort(lst, 0, 99))