Python 3路分区(Quicksort)

时间:2016-06-12 20:20:06

标签: python quicksort partitioning

我正在尝试为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行得到一个错误,该索引超出范围。关于这里有什么问题的任何建议?

1 个答案:

答案 0 :(得分:0)

正如对该问题的评论中所述,代码中的swap()函数无法执行任何操作。在Python中,名称只是附加到对象的标签。如果指定名称,则只需将标签附加到对象即可。将对象传递给函数时,将传递对象,而不是分配给它的名称。函数内的赋值仅为对象创建本地名称,但在函数外部不具有任何可见效果。

但是,您可以修改传递给函数的对象swap()的以下实现可行:

def swap(a, i, j):
    a[i], a[j] = a[j], a[i]

它将传入的列表修改为a