我正在编写一个为一个类玩扑克的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)。在每次迭代中选择最强的手作为支点是没有意义的,但这似乎正在发生。我在俯瞰什么?
答案 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