Python 快速选择算法

Python 快速选择算法,python,recursion,partitioning,Python,Recursion,Partitioning,我目前正在为我的计算机科学课做一个作业,我不知道我执行快速选择的代码有什么问题 def分区(一个列表,第一个,最后一个): pivot=a_列表[最后] i=first-1 对于范围内的j(第一个,最后一个): 如果一个列表[j]我觉得分区函数很好。主要问题与选择功能有关。它们是: 混合0索引和1索引 检查选择函数的边界 处理递归的k值 第1点:混合0索引和1索引 此示例显示: print(selection([5,4,1,10,8,3,2], 0, 6, 1)) 您在问题中说预期输出为1。列

我目前正在为我的计算机科学课做一个作业,我不知道我执行快速选择的代码有什么问题

def分区(一个列表,第一个,最后一个):
pivot=a_列表[最后]
i=first-1
对于范围内的j(第一个,最后一个):

如果一个列表[j]我觉得
分区
函数很好。主要问题与
选择功能有关。它们是:

  • 混合0索引和1索引
  • 检查
    选择
    函数的边界
  • 处理递归的
    k
  • 第1点:混合0索引和1索引 此示例显示:

    print(selection([5,4,1,10,8,3,2], 0, 6, 1))
    
    您在问题中说预期输出为
    1
    。列表
    [5,4,1,10,8,3,2]
    排序为
    [1,2,3,4,5,8,10]
    。在调用
    selection
    函数时,您分别将
    0
    6
    作为
    first
    last
    提供。这两个变量使用0索引。但是,对于
    k
    ,您提供了
    1
    ,并期望
    选择
    函数的输出为
    1
    。这利用了1-1索引

    这没什么错,但事情很快就会变得混乱。我们应该把事情标准化。我选择对
    k
    使用0索引

    第2点:检查
    选择
    函数的边界 特别是,本声明:

    if first == last:
    
    return selection(a_list, pivotIndex+1, last, k - pivotIndex)
    
    应改为:

    if first >= last:
    
    由于以下陈述:

    elif k <= pivotIndex:
        return selection(a_list, first, pivotIndex-1, k)
    else:
        return selection(a_list, pivotIndex+1, last, k - pivotIndex)
    
    无需从
    k
    中减去
    pivotinex
    。即使下一个
    选择
    调用只考虑从
    数据透视索引+1
    最后一个
    (包括)的子列表,我们也不会创建一个只包含
    a_列表[pivotIndex+1]
    a_列表[last]
    的元素的新数组,因此,我们感兴趣的元素仍将位于位置
    k

    随着这些变化 我们可以保持
    分区
    功能不变。以下是更新的
    选择
    功能:

    def selection(a_list, first, last, k):
        # Handle possibility that first >= last, so we only have
        # one element remaining in the sublist
        if first >= last:
            return a_list[k]
        pivot = a_list[last]
        pivotIndex = partition(a_list, first, last)
        if k < pivotIndex:
            return selection(a_list, first, pivotIndex-1, k)
        else:
            # k is left as it is
            return selection(a_list, pivotIndex+1, last, k)
    
    def选择(一个列表,第一个,最后一个,k):
    #处理第一个>=最后一个的可能性,所以我们只有
    #子列表中剩余的一个元素
    如果first>=last:
    返回一个_列表[k]
    pivot=a_列表[最后]
    pivotIndex=分区(一个列表,第一个,最后一个)
    如果k<数据透视索引:
    返回选择(a_列表,第一,数据透视索引-1,k)
    其他:
    #k保持原样
    返回选择(a_列表,数据透视索引+1,最后一个,k)
    
    您应该更改对
    selection
    的调用,以便对
    k
    使用0索引


    希望有帮助

    你在这里很复杂,你想做什么?您的递归没有结束,所以first永远不等于last。