快速排序的几种pivot基数选择方法

import random

def quick_sort(nums, l, r):
    if l >= r:
        return
    pivot = partition_l(nums,l,r)   #可切换以下不同基数选择方法
    quick_sort(nums,l,pivot-1)
    quick_sort(nums,pivot+1,r)
'''
random pivot 随机基数
'''
def partition_ran(nums,l,r):
    pivot = random.randrange(l,r+1)
    nums[pivot],nums[r] = nums[r],nums[pivot]
    i = l-1
    for j in range(l,r):
        if(nums[j]<nums[r]):
            i += 1
            nums[i], nums[j] = nums[j], nums[i]
    nums[i+1], nums[r] = nums[r], nums[i+1]
    return i + 1


'''
leftmost as pivot  最左边元素为基数
'''
def partition_l(nums,l,r):
    i = l
    for j in range(l+1,r+1):
        if nums[j] < nums[l]:
            i += 1
            nums[i], nums[j] = nums[j], nums[i]
    nums[i], nums[l] = nums[l], nums[i]
    return i



'''
rightmost as pivot  最右边元素为基数
'''
def partition_r(nums,l,r):
    i = l - 1
    for j in range (l,r):
        if nums[j] < nums[r]:
            i += 1
            nums[i],nums[j] = nums[j],nums[i]
    nums[i+1],nums[r] = nums[r],nums[i+1]
    return i + 1

a = random.sample(range(0,10),6)
print("original%s"%a)
quick_sort(a,0,len(a) - 1)
print("answer%s"%a)

partition中的index非常易错。

而分别以左右元素为基数时的两种快排,看似相似,实际上index有差别,(主要是最后pivot是和i还是i+1交换,注意到 i作为维持partition的分界线,i 左边的元素都比pivot小,i 右边的元素都比pivot大。

以右pivot为例子,与右pivot交换的必定是i右边的元素,否则的话不能维持右侧parition都大于pivot的性质)稍微没捋对就会出错。

随机基数快排:随机选取index,然后和最左或者最右元素交换,转换成已解决的问题。随机基数下我们期望平均情况下对数组的paritition比较均衡,并且对一些极端例子的最坏情况下的处理会更好。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值