2015-04-20 113 views
-1

我在寫一個爲班級玩撲克的python程序,我需要對五張牌手列表進行排序。我有一個名爲wins()的函數,它需要兩隻手,如果第一個擊中第二個,則返回True,如果不是,則返回False。我寫了一個快速排序的實現來對手的列表進行排序,並且我注意到它花費的時間遠遠超過預期,所以我將其編程爲打印每個正在排序的列表的長度。該函數如下所示:快速排序和python問題

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, , 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

你爲什麼寫自己的排序?python是否有自己的排序功能? –

+0

我不排序數字,我正在排序撲克牌。 –

+4

似乎要做的事情是[創建lambda](https://wiki.python.org/moin/HowTo/Sorting)來對元組或命名對象進行排序。 –

回答

0

編輯答案:

你可以試試下面的代碼和分享您的結果。它引入了一個等價類,以減少「輸或綁」(或「小於或等於」)羣體的人口,同時通過遞歸形成答案。

# 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

+0

我試過每次我都可以選擇pivot。平均而言,我認識到,給定一個隨機選擇的支點,它應該是O(n log n)。這並不有助於事實並非如此。另外,爲什麼選擇中間索引元素的樞軸更有可能工作? –

+0

爲什麼你認爲隨機會比固定中點選擇更好?由於未排序列表的選擇置換的概率,對於算法複雜度來說,它們幾乎是相等的情況。參考:http://en.m.wikipedia.org/wiki/Quicksort。如果不太敏感,請提供您的測試功能和數據,以便分析您的問題。 –

+0

爲什麼你認爲固定中點選擇會更好?我已經嘗試過兩種方法,它們都是一樣的,它們都失敗了。我給你我的排序函數,我告訴你它使用了一個叫做wins(a,b)的函數,我知道這個函數是有效的。如果快速排序算法每次都失敗了,它會做的事情以及偶然發生的概率是2^64中的一個,它是這樣的,而且我已經完成了這個數百次,我必須這樣做,必須我的算法出了問題,這是我要求你幫助我找到的,你沒有做的。請停止告訴我它應該工作。 –