# 快速排序递归玩法
def quicksort(arr):
# 结束条件
if len(arr) <= 1:
return arr
# 用中间值更稳定
middle = arr[len(arr) // 2]
# 记得将middle拿出来,最后再放到中间
del arr[len(arr) // 2]
# 利用列表生成式,100W数据,2.9s
# left = [x for x in arr if x <= middle]
# right = [x for x in arr if x > middle]
# 2.6s
left = []
right = []
for x in arr:
left.append(x) if x <= middle else right.append(x)
# 记得把middle放中间
return quicksort(left) + [middle] + quicksort(right)
# 非递归玩法
def quicksort2(arr):
'''
模拟栈操作实现非递归的快速排序
'''
if len(arr) < 2:
return arr
stack = []
stack.append(len(arr) - 1)
stack.append(0)
while stack:
l = stack.pop()
r = stack.pop()
index = partition(arr, l, r)
if l < index - 1:
stack.append(index - 1)
stack.append(l)
if r > index + 1:
stack.append(r)
stack.append(index + 1)
def partition(arr, start, end):
# 分区操作,返回基准线下标
pivot = arr[start]
while start < end:
while start < end and arr[end] >= pivot:
end -= 1
arr[start] = arr[end]
while start < end and arr[start] <= pivot:
start += 1
arr[end] = arr[start]
# 此时start = end
arr[start] = pivot
return start
if __name__ == '__main__':
li = list(range(1000000))
import random
random.shuffle(li)
sorted = quicksort(li)
print(sorted[:10])
快速排序。
来源:https://www.cnblogs.com/leokale-zz/p/12174207.html