本章内容
分而治之:通用问题的解决方法 devide and conquer D&C,经典的递归式解决问题的方法
快速排序:使用分而治之的快速排序策略
分而治之
一:1680*640的小土地,能分出多少个最大的正方形(求最大公倍数)
- 找出基线条件
- 不断将问题缩小
快速排序
基线条件:设计数组递归函数,基线条件通常是数组为空或者包含一个元素。
Haskell编程:没有while循环,只有递归。
基准值(pivot):从数组中选择一个元素,作为基准值。这里将第一个元素作为基准值
三个元素的快排:
- 选择基准值
- 将数组分为:小于基准值&大于基准值
- 对两个子数进行快速排序
归纳证明:基线条件&归纳条件 和递归是一样的
def quicksort(array):
if len(array)<2:
return array
else:
pivot = 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])
大O表示法
快排的平均时间O(nlogn),真正的时间是C*N,C为每次执行的固定时间。
快排的最糟糕情况O(N*N),和简单查找一样。