快排的两种partition函数

partition函数就是快排的关键部分,作用是将数组划分成两部分,左边小于基数,右边大于基数

但实际上它也不仅仅用于快排,在求top(K)问题中也常常会用到。

下面介绍两种partition函数,他们都是双指针的方法,但具体会有差异:

函数一:头尾指针向中间夹

def partition(array,left,right):
    baseNumber = array[left]	# 基数的位置也可以随机取,避免有序列表导致最坏的复杂度
    while left<right:
        while left < right and baseNumber <= array[right]:
            right -= 1
        array[left] = array[right]	# 这一步之后不用再 left += 1,因为下面的循环第一次肯定满足
        while left < right and baseNumber >= array[left]:
            left += 1
        array[right] = array[left]
    array[left] = baseNumber
    return left
函数二:双指针都从头开始

第二种partitition函数,也是双指针,但都是从头开始,一个占坑(记录下一个要替换的位置),一个遍历,同样要选择基准值,实际上也可以以任何一个元素作为基准值,下面以第一个元素作为基准值:

def partition(array, left, right):
    baseNumber = array[left]
    x = left
    for y in range(left, right):
        if array[y]<baseNumber:
            x+=1
            array[x], array[y] = array[y],array[x]
    array[x], array[left] = array[left], array[x]
    return x

def quich_sort(a, left, right):
    if left<right:
        index = partitionA(a, left, right)
        quich_sort(a,left, index-1)
        quich_sort(a, index+1, right)

a=[4,1,3,2,-3,6]
quich_sort(a, 0, len(a))
print(a)

这个partition函数不需要知道数组的长度,是从头到尾遍历过去的,因此也可以用于链表的快排:链表的快排和归并排序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海晨威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值