Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中带有就地快速选择(又称线性时间选择)的Bug_Python_Algorithm_Quicksort - Fatal编程技术网

Python中带有就地快速选择(又称线性时间选择)的Bug

Python中带有就地快速选择(又称线性时间选择)的Bug,python,algorithm,quicksort,Python,Algorithm,Quicksort,我正在学习斯坦福大学的课程“算法:设计与分析,第1部分”,在尝试用Python实现一个就地随机选择算法(即基于快速排序的选择)时,我相信我的分区函数是正确的,但我无法理解为什么选择部分一直失败,任何建议都非常感谢。我的代码如下: 随机导入 def随机_选择(nums、开始、结束、i): 如果结束==开始: 返回nums[开始] elif开始end调用random_selection会怎么样?@abukaj我添加了start>end场景,谢谢comment@Will:这解决了你的问题吗?@mart

我正在学习斯坦福大学的课程“算法:设计与分析,第1部分”,在尝试用Python实现一个就地随机选择算法(即基于快速排序的选择)时,我相信我的分区函数是正确的,但我无法理解为什么选择部分一直失败,任何建议都非常感谢。我的代码如下:

随机导入
def随机_选择(nums、开始、结束、i):
如果结束==开始:
返回nums[开始]
elif开始<结束:
pivot=分区(nums、start、end)
如果pivot==i:
返回nums[枢轴]
elif pivoti:
返回随机_选择(nums、start、pivot-1、i)
其他:
返回错误
def分区(nums、开始、结束):
pivot_值=nums[开始]
左=开始+1
右=结束
完成=错误
虽然没有这样做:
而左右:
完成=正确
其他:
nums[左]、nums[右]=nums[右]、nums[左]
nums[start],nums[right]=nums[right],nums[start]
返回权
测试=范围(10)
对于范围(10)内的i:
随机洗牌(测试)
打印随机选择(测试,0,透镜(测试)-1,i)
以下是我收到的测试用例结果:

0
1

3
4

5
4
8
没有


问题是您需要确定索引是基于0还是基于开始

除了对随机_选择的递归调用外,大多数代码都使用基于0的索引:

return random_selection(nums, pivot + 1, end, i - pivot)
它将i索引调整为
i-start
(即假设索引基于start)

将此更改为:

return random_selection(nums, pivot + 1, end, i)

应该给出预期的结果。

如果用start>end调用random_selection会怎么样?@abukaj我添加了start>end场景,谢谢comment@Will:这解决了你的问题吗?@mart0903不太可能,我的随机选择函数似乎有逻辑错误。我还在想。@m69谢谢校对!