繁体   English   中英

Python 3方式分区(Quicksort)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM