li =[i for i inrange(1,5000000)]
random.shuffle(li)defquick_sort(li, left, right):if left < right:
mid = partition(li, left, right)
quick_sort(li, left, mid -1)
quick_sort(li, mid +1, right)defpartition(li, left, right):
tmp = li[left]while left < right:while left < right and li[right]>= tmp:
right -=1
li[left]= li[right]while left < right and li[left]<= tmp:
left +=1
li[right]= li[left]
li[left]= tmp
return left
quick_sort(li,0,len(li)-1)print(li)
li =[i for i inrange(1,5000000)]
random.shuffle(li)defmerge_sort(li):
n =len(li)if n <=1:return li
mid = n //2
li_left = merge_sort(li[:mid])
li_right = merge_sort(li[mid:])
result_li =[]
left_pointer =0
right_pointer =0while left_pointer <len(li_left)and right_pointer <len(li_right):if li_left[left_pointer]< li_right[right_pointer]:
result_li.append(li_left[left_pointer])
left_pointer +=1else:
result_li.append(li_right[right_pointer])
right_pointer +=1
result_li += li_left[left_pointer:]
result_li += li_right[right_pointer:]return result_li
li = merge_sort(li1)print(li)
堆排序
li =[i for i inrange(1,5000000)]
random.shuffle(li)defsift(li, low, high):"""
@param li: 列表
@param low: 堆的根节点位置
@param high: 堆的最后一个元素位置
@return:
"""
i = low # 根节点
j =2* i +1# 子节点
tmp = li[low]# 堆顶存起来while j <= high:# 只要j位有数if j +1<= high and li[j +1]> li[j]:# 如果右孩子,且比较大
j = j +1# 指向右孩子if li[j]> tmp:
li[i]= li[j]
i = j # 往下一层
j =2* i +1else:# tmp 更大,把 tmp 放到 i 上# 把tmp放到某一级领导位置上break
li[i]= tmp # 把tmp放到叶子节点上defheap_sort(li):
n =len(li)for i inrange(n //2-1,-1,-1):# i 代表建堆时调整的部分的根的下标
sift(li, i, n -1)# 建堆完成for i inrange(n -1,-1,-1):# 指向当前堆的最后一个元素
li[0], li[i]= li[i], li[0]
sift(li,0, i -1)# i-1时是新的high
heap_sort(li)print(li)
import heapq
import random
lis =list(range(30))
random.shuffle(lis)# 打乱print(lis)
heapq.heapify(lis)# 建堆
n =len(lis)for i inrange(n):print(heapq.heappop(lis), end=',')