[英]Python 3 way partitioning (Quicksort)
我正在尝试为3路分区编写python代码,但是出现索引错误。 我试图修复它,但似乎没有成功。 在我的代码中,我选择第一个条目作为枢轴,然后从左向右扫描,并在必要时交换值。 如果有任何项等于数据透视,则将其移至a的开头或末尾(出现错误)。
这是我的代码
def partition(a, start, end):
left=start+1
right=end
p=start+1
q=end
pivot=a[start]
while True:
while a[left]<pivot:
left+=1
while a[right]>pivot:
right-=1
if right==start+1:
break
if left>=right:
break
swap(a[left], a[right])
if a[left]==pivot:
swap(a[p],a[left])
p+=1
if a[right]==pivot:
swap(a[right], a[q])
q-=1
swap(a[right], a[start])
k=end
while k>=q+1:
swap(a[left+1], a[k])
k-=1
left+=1
k=1
while k<p:
swap(a[k], a[right+1])
k+=1
right-=1
我将交换定义为:
def swap(a, b):
temp=a
a=b
b=temp
当我尝试运行此功能时,在第21行出现错误,该索引超出范围。 对这里有什么问题有什么建议吗?
如问题评论中所述,代码中的swap()
函数不执行任何操作。 在Python中,名称只是附加到对象的标签。 如果分配名称,则只需在对象上附加标签。 将对象传递给函数时,将传递该对象,而不是分配给它的名称。 函数内部的赋值只会为对象创建本地名称,而在函数外部没有任何可见的效果。
不过,您可以修改传递给函数的对象 。 swap()
的以下实现将起作用:
def swap(a, i, j):
a[i], a[j] = a[j], a[i]
它修改通过了作为列表a
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.