快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。
步骤为:
递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。
选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。
import random
numbers_list = random.sample(range(1,50),15) # 在1~50范围内生成不重复的15个随机数
def quicksort(arr:list) -> list: # 定义参数类型及输出类型
if len(arr) <= 1: # 如果列表只有一个元素或没有元素则返回列表,也是递归技术的条件
return arr
# 选择基准值
pivot = arr[random.randint(0,len(arr)-1)] # 随机选择基准值
left = [x for x in arr if x < pivot] # 通过推导式创建一个列表,所有值都小于基准值
middle = [x for x in arr if x == pivot] # 通过推导式创建一个列表,所有值都等于基准值
right = [x for x in arr if x > pivot] # 通过推导式创建一个列表,所有值都大于基准值
print('left:',left,' ','middle:',middle,' ','right:',right,'-----|') # 输出程序计算过程,方便理解
return quicksort(left)+middle+quicksort(right) # 递归,调用自身函数
print(quicksort(numbers_list))