我正在尝试为3路分区编写python代码,但是我得到了索引错误。我试图解决它,但似乎没有成功。在我的代码中,我选择第一个条目作为枢轴,然后从左侧和右侧扫描,如有必要,交换值。如果任何条目等于pivot我将它移动到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
我将swap定义为:
def swap(a, b):
temp=a
a=b
b=temp
当我尝试运行此函数时,我在第21行得到一个错误,该索引超出范围。关于这里有什么问题的任何建议?
答案 0 :(得分:0)
正如对该问题的评论中所述,代码中的swap()
函数无法执行任何操作。在Python中,名称只是附加到对象的标签。如果指定名称,则只需将标签附加到对象即可。将对象传递给函数时,将传递对象,而不是分配给它的名称。函数内的赋值仅为对象创建本地名称,但在函数外部不具有任何可见效果。
但是,您可以修改传递给函数的对象。 swap()
的以下实现可行:
def swap(a, i, j):
a[i], a[j] = a[j], a[i]
它将传入的列表修改为a
。