快排代码
import random
from xxx.cal_time import cal_time
import sys
sys.setrecursionlimit(100000)
# 分割,找到中间值
def partition(li, left, right):
tmp = li[left]
while left < right:
while li[right] >= tmp and left < right: # 再往左找
right -= 1 # 往左走一步
li[left] = li[right] # 把右边的值写到左边空位上
# print(li)
while li[left] <= tmp and left < right:
left += 1
li[right] = li[left] # 把左边的值写到右边空位上
# print(li)
li[left] = tmp # 把tmp归位]
return left
# 快排,递归
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)
return li
@cal_time
def quick_sort(li):
_quick_sort(li, 0, len(li) - 1)
# li = list(range(10000))
# random.shuffle(li) # shuffle() 方法将序列的所有元素随机排序。
# quick_sort(li)
# print(li)
# print(li)
# partition(li, 0, len(li)-1)
# print(li)
# li1 = [5, 7, 4, 6, 3, 1, 2, 9, 8]
# partition(li1, 0, len(li1) - 1)
# print(li1)
# print("---------------------------------------")
# li2 = [9, 8, 7, 6, 5, 4, 3, 2, 1]
# partition(li2, 0, len(li2) - 1)
# print(li2)
# 有个最坏情况,递归深度超出限制 RecursionError: maximum recursion depth exceeded in comparison
li3= list(range(5000, 0, -1))
quick_sort(li3)
计算时长的方法
import time
def cal_time(func):
def wrapper(*args, **kwargs):
t1 = time.time()
result = func(*args, **kwargs)
t2 = time.time()
print("%s running time: %s secs." % (func.__name__, t2 - t1))
return result
return wrapper