算法:快速排序的实现

理解:
快速排序对问题分而治之的一种方法,在每一趟排序后,都能确定一个数的位置(即分割点),因此快速排序的核心是确定分割点的位置并把数组按大小分在分割点的两侧。

因此快排可以分为两部分,第一部分是递归处理问题,第二部分是找到分割点
第一部分:

def quickSort(l, r):
	if l >=r:
        return
    p = partition(nums, l, r)
    quickSort(l, p - 1)
    quickSort(p + 1, r)

第一部分比较简单, 关键在于第二部分的实现,在这里我列出2种比较常见的方法

  1. 方案一
 def partition(A, l, r):
     tmp = A[r]
     i = l - 1
     for j in range(l, r):
         if A[j] < tmp:
             i += 1
             A[i], A[j] = A[j], A[i]
     A[i + 1], A[r] = A[r], A[i + 1]    
     return i + 1

这个数《算法导论》伤的伪代码实现,思路是以数组最后一个值作为分割点 x,使用两个指针i和j,在遍历j的过程中,每次把j停在比 x 小的位置,然后把 i + 1 和 j 的位置的值对调。
在这个过程中,i + 1 位置的值有两种情况
1: 小于x,这种情况下,由于j会停在比x小的地方,那么j = i + 1,所以此时对调 i + 1 和 j 的位置等于没变。
2.大于等于x,这种情况下 j 会停在后面第一个比 x 小的位置,此时对调相当于是把比 x 小的的值移到了数组前面,比 x 大的值移到了数组后面
通过这个算法能保证当 j 遍历完之后,在 0~i 位置的值都比 x 小,而在 i + 1 ~ n - 2 的值都比x大。这样,在最后对调 i + 1 和 n - 1 位置(即x)的值就完成了分割,并且 i + 1就是分割点

  1. 方案二:
def partition(A, l, r):
    tmp = A[l]
    while l < r:
        while A[r] > tmp and l < r:
            r -= 1
        A[l] = A[r]
        
        while A[l] <= tmp and l < r:
            l += 1
        A[r] = A[l]
    
    A[l] = tmp
    return l

这个方法就是比较常见的通过一前一后两个指针调换值的位置。值得注意的是,该方法使用的思路略微不同于直接swap,而是先找到右边比 x 小的值,把左边 i 位置直接设置成右边的值(因为初始设置以第一个数作为分割值,所以可以直接覆盖掉这个值),然后再找到左边比 x 大的值,把右边 j 位置直接设置成左边的值(此时右边的值在上一步已经赋值到了左边)当i = j 时,这个位置的值已经被左边或者右边赋值,并且这个点就是分割点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值