《算法图解》第四章 快速排序与递归
列表求和的循环和递归表示
循环
def sum(arr):
total = 0
for x in arr:
total += x
return total
print(sum(arr))
递归
基线条件:
- 如果数组不包括任何元素,则和为0
- 如果数组只有一个元素,则直接返回
def sum(arr):
if len(arr)==0:
return 0
elif len(arr)==1:
return arr[0]
else:
return arr[0] + sum(arr[1:])
快排
快排思路
- 选择基准值
- 将数组分成两个子数组:小于基准值的元素和大于基准值的元素
- 对这两个子数组进行快速排序
快排代码
def quicksort(array):
if len(array)<2:
return array
esle:
pviot = array[0]
less = [i for i in array[1:] if i <=pivot]
greater = [i for i in array[1:] if i > pivot]
return quicksort(less) + [pivot] + quicksort(greater)
print(quicksort([10,5,2,3]))
小结
- D&C将问题逐步分解。使用D&C处理列表时,基线条件很可能是空数组或只包含一个元素的数组。
- 实现快速排序时,请随机地选择用作基准值的元素。快速排序的平均运行时间为O(nlog n)。
- 大O表示法中的常量有时候事关重大,这就是快速排序比合并排序快的原因所在。
- 比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时,O(logn)的速度比O(n)快得多。

浙公网安备 33010602011771号