我是靠谱客的博主 完美夕阳,最近开发中收集的这篇文章主要介绍快速排序的几种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比较均衡,并且对一些极端例子的最坏情况下的处理会更好。

最后

以上就是完美夕阳为你收集整理的快速排序的几种pivot基数选择方法的全部内容,希望文章能够帮你解决快速排序的几种pivot基数选择方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部