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。