快速排序
算法体现分治法的部分:
核心部分:
用我自己的语言来说,PARTITON算法,将A[r]作为主元,在对数组扫描时,遇到比主元小的,就将其放到前面。(如果你要复述伪代码,在确定i,j的初始值的时候,建议拿个实例先试一试)
用循环不变式表示即为:
快速排序的另一种形式
快速排序,在第二版书里,算法的形式不像第三版这样,而是如下
(第10行A[j]应该改为A[i])
思想是任取一个主元(算法里取的是第一个元素),假设前半部分都得存小于它的,后半部分都得存大于它的,从两头开始向中间扫描,遇到不符合的,两两调换;直到扫描到同一个元素,那么这个元素就放到了排好序该在的位置。
快速排序的random形式
因为主元永远是最后一个元素,使得某些情况下,算法时间极其长,所以为了平摊给各种情况,在划分前,对主元做一次变换。
但想一想也知道,就连老师也说,这对时间复杂度没有任何的改进。
快速排序时间复杂度
最坏情况:当数组已经排好序了,O(n^2)
期望时间:O(nlgn)