快速排序和python的问题

时间:2015-04-20 19:40:02

标签: python sorting

我正在编写一个为一个类玩扑克的python程序,我需要对五个牌手的列表进行排序。我有一个名为wins()的函数,如果第一个击败第二个,则返回True,如果没有,则返回True。我写了一个快速排序的实现来排序手的列表,我注意到它花了比预期更长的时间,所以我编程它打印它正在排序的每个列表的长度。该函数如下所示:

def sort(l):
    if len(l) <= 1:
        return l
    print len(l)
    pivot = choice(l)
    l.remove(pivot)
    left = []
    right = []
    for i in l:
        if wins(i, pivot) == True:
            right.append(i)
        else:
            left.append(i)
    return sort(left) + [pivot] + sort(right)

当我把它分成64只手时,它打印出来: 64, 53, 39, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 12, 7, 3, 2, 3, 2, 4, 3, 2, 13, 9, 6, 2, 3, 2, 2, 3, 10, 8, 2, 5, 4, 3, 2.注意中间的连续序列?我无法弄清楚它为什么这样做,但它导致快速排序表现得像O(n ^ 2)。在每次迭代中选择最强的手作为支点是没有意义的,但这似乎正在发生。我在俯瞰什么?

1 个答案:

答案 0 :(得分:0)

评论后编辑回答:

您可以尝试以下代码并分享您的搜索结果。它引入了一个等价类来减少“失败”或“平局”中的人口数量。 (或&#34;小于或等于&#34;)组通过递归形成答案。

# modified quicksort with equivalence class.
def sort(l):
    if len(l) <= 1:
        return l
    print len(l)
    pivot = choice(l)
    l.remove(pivot)
    left = []
    right = []

    # I added an equivalence class
    pivotEquivalence = [pivot] 

    # and an equivalence partitioning 
    # to reduce number of elements 
    # in the upcoming recursive calls
    for i in l:
        if wins(i, pivot) == True:
            right.append(i)
        elif wins(pivot,i) == True:
            left.append(i)
        else 
            pivotEquivalence.append(i)
    return sort(left) + pivotEquivalence + sort(right)

==

不要随机选择轴,而是尝试使用中间索引元素。平均而言,它将保证O(N log N)。

对于O表示法,您需要进行许多模拟以收集经验数据。只有一个例子可能会产生误导。

尝试打印枢轴及其索引。通过random.shuffle(列表)随机播放列表,然后再次尝试查看分发。只需确保系统时间播种。

您是否可以发送完整代码和社区数据以重复发布问题?

此致 了Umut