算法导论学习之快速排序

        快速排序是性能比较好的一种排序算法,它的平均时间复杂度为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),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。下面是随机化快速排序的伪代码:




         随机化快速排序的代码和快速排序基本一样,只是在真正交换之前换了数组中一个随机的数做为主元。以上为快速排序的主要思想和伪代码,具体的实现代码以后遇到再补上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值