快速排序算法

快速排序

快速排序是一个最坏情况时间复杂度为Θ(n2)Θ(n2),最好情况下时间复杂度为O(nlogn)O(nlogn)的排序算法。虽然在最坏情况下的时间复杂为n2n2,但是快速排序的平均性能非常好,只有Θ(nlogn)Θ(nlogn),而且我们也可以主动避免快速排序的最差的情况,所以快速排序在排序作业中还是应用比较广泛的。

快速排序的基本思想

我们现在有一数组A={ai,ai+1,...,aj}A={ai,ai+1,...,aj},假定我们将数组AA排序得到数组B={bi,bi+1,...,bj}B={bi,bi+1,...,bj} ,数组AA和数组BB里面的元素全都想用,只是元素的顺序不同。现在我们希望找到数组AA里面的一个任一元素amam在数组BB中的位置k(ikj)k(i≤k≤j)。在排序之前,如果我们一开始就知道位置kk应该放置元素amam,那么排序岂不是很简单,我们只需要将各个元素放到对应的位置上不久可以了吗?

那下面我们就来找一个数组AA里面任意元素amam的应该放置的目标位置kk,这个位置kk应该满足这样的特性ai...k1akak+1...jai...k−1≤ak≤ak+1...j,就是位置kk的左边的元素应该不大于akak,位置kk右边的元素应该不小于元素akak
即:

ai,ai+1,...,ak1ak,ak,ak+1,...,aj1,ajakai,ai+1,...,ak−1⏟≤ak,ak,ak+1,...,aj−1,aj⏟≥ak

所以我们只需要将大于 akak的元素移到数组的右边,小于等于 akak的元素移到数组的左边就可以啦。

让然后我们对剩下的两个子数组A˙={ai,..,ak1}A˙={ai,..,ak−1}A¨={ak+1,...,aj}A¨={ak+1,...,aj}进行同样的递归操作,直到我们找到所有的元素的目标位置kk,并将元素放入

总的来说,可以分为下面几个步骤:

  • 找到元素ajaj(这里选择的amam为最优一个元素)的目标位置kk
  • 将位置jj和位置kk的元素交换,因为位置kk就是ajaj的目标位置,只是现在被元素akak占用着。
  • 得到两个子问题A˙={ai,..,ak1}A˙={ai,..,ak−1}A¨={ak+1,...,aj}A¨={ak+1,...,aj}
  • 对这两个子问题采用相同的方法,直到每一个元素都放在了目标位置上

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值