快速排序是性能比较好的一种排序算法,它的平均时间复杂度为O(n lgn),而且在实际应用中它还要比时间复杂度同为O(n lgn)的归并排序及其他一些算法要快一些。下面让我们来看一下快速排序。
快速排序也应用了分治的思想。首先选取一个数组的第一个或最后一个元素做为主元,然后以这个元素为轴点对数组进行划分,比这个元素小的放在左边,比它大的放在右边。然后递归的调用快排方法,直至数组有序。伪代码如下:
然后是partition的实现伪代码:
其中partition方法为实现关键代码,它实现了将比主元小的元素交换到左边,比主元大的元素交换到右边的步骤。具体的实现为当A[j]大于x(选定的主元)什么也不做,将j后移;当A[j]<=x时,对A[i]和A[j]进行交换,A[i]是介于大于主元的元素和小于主元的元素中间的那个元素。最后再将主元插入到大于主元的元素和小于主元的元素中间,这样就实现了将大于主元的元素和小于主元的元素的分离。后面的就是递归调用快速排序方法对子数组进行交换,当递归完成后,数组就变为了有序数组。下面是一个实例,通过调用快速排序对数组进行排序的过程:
、
快速排序的缺点及改进:快速排序在最坏情况下的运行时间为O(n^2)。当数组有序时,会产生最坏情况,因为此时算法运行时间的递归式为T(n)=T(n-1)+T(0)+cn,解这个递归式可知运行时间为O(n^2)。所以快速排序的运行时间会依赖输入的顺序,可以对快速排序进行一些优化。比较常见的优化方法是随机化快速排序算法,即随机选取一个元素作为主元。这种情况下虽然最坏情况仍然是O(n^2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。下面是随机化快速排序的伪代码:
随机化快速排序的代码和快速排序基本一样,只是在真正交换之前换了数组中一个随机的数做为主元。以上为快速排序的主要思想和伪代码,具体的实现代码以后遇到再补上。