在python快速排序中选择mid pivot元素时出错

时间:2016-04-06 15:04:33

标签: python recursion quicksort

我写了一个快速排序代码。除了一个元素保持未排序外,它工作正常。我试过调试但是徒劳无功。你能帮我找一下潜在的错误。

这是代码。

def qsort(l,start,end):

    if start >= end :
       return
    i,j = start, end
    pivot = (start + (end - start)/2)    

    while i<=j:
        while(l[i] < l[pivot]):
            i+=1
        while(l[j] > l[pivot]):
            j-=1
        if(i<=j):
           l[i],l[j] = l[j],l[i]
           i+=1
           j-=1

    qsort(l,start,j)
    qsort(l,i,end)

    return l

    a = [67,89,45,23,15,19,1,14,100]
    print qsort(a,0,len(a)-1)

上述代码的输出为[1,14,15,23,19,45,67,89,100]。出于某种原因,23和19的位置不会互换。

但是如果我选择一个带有pivot = random.randint(fst,lst)语句的随机数据集,我会得到一个完全排序的列表。有人可以解释一下这个原因吗?

1 个答案:

答案 0 :(得分:0)

在尝试理解您自己的参考实现时,您可能会发现这些参考实现很有用。

返回新列表:

def qsort(array):
    if len(array) < 2:
        return array
    head, *tail = array
    less = qsort([i for i in tail if i < head])
    more = qsort([i for i in tail if i >= head])
    return less + [head] + more

对列表进行排序:

def quicksort(array):
    _quicksort(array, 0, len(array) - 1)

def _quicksort(array, start, stop):
    if stop - start > 0:
        pivot, left, right = array[start], start, stop
        while left <= right:
            while array[left] < pivot:
                left += 1
            while array[right] > pivot:
                right -= 1
            if left <= right:
                array[left], array[right] = array[right], array[left]
                left += 1
                right -= 1
        _quicksort(array, start, right)
        _quicksort(array, left, stop)

从可迭代中生成已排序的项目:

def qsort(sequence):
    iterator = iter(sequence)
    head = next(iterator)
    try:
        tail, more = chain(next(iterator), iterator), []
        yield from qsort(split(head, tail, more))
        yield head
        yield from qsort(more)
    except StopIteration:
        yield head

def chain(head, iterator):
    yield head
    yield from iterator

def split(head, tail, more):
    for item in tail:
        if item < head:
            yield item
        else:
            more.append(item)