Python快速排序实现错过了重复的元素

时间:2013-03-20 05:39:33

标签: python sorting python-2.7 quicksort

我正在使用Python实现快速排序。我的代码成功排序列表,但未能包含重复的元素。请帮我找到错误。

from random import choice

def quickSort(lst):
    if not lst:
        return []
    else:
        pivot = choice(lst)
        lesser = quickSort([l for l in lst if l < pivot])
        greater = quickSort([l for l in lst if l > pivot])
        #print lesser, pivot, greater
        return lesser + [pivot] + greater

print quickSort([3, 2, 5, 6, 1, 7, 2, 4,234, 234, 23, 1234, 24, 132])

输出:

[1, 2, 3, 4, 5, 6, 7, 23, 24, 132, 234, 1234]

2 个答案:

答案 0 :(得分:6)

您的一个条件必须是<=>=(但不是两者)。

否则,最终选择其中一个重复元素作为一个支点,由于其他副本既不大于也不小于支点,它们不会被传递给{{1}中的任何一个}或lesser排序。

但是,由于您没有为项目使用唯一标识符,因此在您使用整数的示例中,这也会将您的数据透视包含在集合中。为了避免这种情况,您可能需要为您的数据透视表而不是选择索引

例如:

greater

测试:

from random import randint

def quickSort(lst):
    if not lst:
        return []
    else:
        pivot = randint(0, len(lst) - 1)
        pivot_value = lst[pivot]
        lesser = quickSort([l for i,l in enumerate(lst)
                           if l <= pivot_value and i != pivot])
        greater = quickSort([l for l in lst if l > pivot_value])
        return lesser + [pivot_value] + greater

答案 1 :(得分:0)

您无法确保列表中只有一个元素是等于pivot。 你应该回复:

return lesser + [pivot]*(len(lst) - len(lesser)- len(greater)) + greater