进入图解算法四,看完这一章对一些概念性的东西有了一些理解,在这里记录下。
分而治之----一种著名的递归式问题解决的方法:
D&C的思想就是不断将问题缩小规模,知道符合基线条件(基线条件通常是数组为空或者只包含一个元素),快速排序就是一种使用了D&C的经典例子
快速排序代码如下:
def quick_sort(arr):
if len(arr) < 2:
return arr #基线条件
else:
pivot = arr[0] #基准值
less = [i for i in arr[1:] if i <= pivot]
grater = [i for i in arr[1:] if i > pivot]
return quick_sort(less) + [pivot] + quick_sort(grater)
print(quick_sort([10, 5, 3, 54, 23]))
快速排序速度很快,运行时间为O(nlog^n),但是在最遭的情况下很慢,运行时间为 O(n^2 )。
最遭情况:一般来说会选择第一个值作为基准值,如果元素在有序的情况下,左边总会得到一个空的数组,调用的高度会达到很大,这是最遭的情况。调用的栈多,栈长为O(n),每层需要的时间为O(n),运行时间为
O(n) * O(n) = O(n^2)
最佳情况:如果每次选择的基准值都可以将数组分为两半,那么就不需要那么多递归调用,调用栈也就少,栈长为O(log^n), 每层需要的时间为O(n),运行时间为 O(log^n) * O(n) = O(nlog^n)
小结:
>1D&C的主要思想就是将问题逐步分解,直到问题达到基线条件结束
2实现快速排序时,基准值最好随机选择,这样出现最糟情况的概率就会极小