2013-02-08 173 views
0

爲了好玩,我試圖實現k路合併排序,其中k = 3。我沒有問題遞歸調用mergesort,但我試圖合併三個列表在一起,但我沒有得到一個排序列表。基本的想法是,我比較每個列表的第一個元素,如果它是最小的,我將它附加到列表中。我重複所有陣列的過程。將三個列表合併在一起

def three_merge(a,b,c): 
    i =0 
    j =0 
    k=0 
    list = [] 
    while(i < len(a) or j < len(b) or k < len(c)): 
     while(a[i] <= b[j] and a[i] <= c[k]): 
      list.append(a[i]) 
      i=i+1 
      print i 
     while(b[j] <= a[i] and b[j] <= c[k]): 
      list.append(b[j]) 
      j=j+1 
      print j 
     while(c[k] <= a[i] and c[k] <= b[j]): 
      list.append(c[k]) 
      k=k+1 
      print k 
    return list  

a = [1,2] 
b = [-5,10] 
c = [-11, 100] 
print three_merge(a,b,c)        
+0

你知道,這可能是一個/兩個班輪。想到「排序(a + b + c)」。 – Amelia

+0

返回列表應該在你的while循環中還是在它之後? –

+0

我試圖不使用內置函數 – phil12

回答

1

的問題是,你預先將索引i, j, k爲每個追加到排序的列表值,這意味着,該索引是比相應的輸入列表中的取列表中的所有元素後的長度大於一個。因此,當您比較不同輸入列表中元素的值時,最終會達到您要嘗試執行的操作,實際上,a[len(a)]將始終提供索引錯誤。

+0

對現有代碼進行更改會很繁瑣。我可能會重寫從這個代碼,我會有一堆if語句。 – phil12

+0

@ phil12是的,是嗎?您當前的設計不起作用,因此需要進行更改。如果它變得醜陋,也許不同的方法更好。 –

0

你爲什麼不考慮三個列表合併爲兩個列表

def merge(a,b): 
    L = a 
    l = b 
    i = 0 
    j = 0 
    res = [] 
    if (len(b)>len(a)): 
     L=b 
     l=a 
    #print L 
    #print l 
    while (i<len(L)): 
     if(len(l)>0): 
      while (j<len(l)): 
       if (L[i]<=l[j]): 
        res.append(L[i]) 
        del L[i] 
        break 
       else: 
        res.append(l[j]) 
        del l[j] 
     else: 
      #print res 
      res = list(res+L) 
      L=[] 
      break 
    if len(l)>0: 
     res = list(res+l) 
     l=[] 
    return res 

def threeMerge(a,b,c): 
    return merge(merge(a,b),c) 

aa = [1,2] 
bb = [-5,3,20] 
cc= [-11, 23,45] 
print threeMerge(aa,bb,cc) 
0

兩個合併的組成下面是n路合併的簡單功能。隨意問你是否有疑問:

def merge(*args): 
    lst = list(args) 
    idx = [0] * len(lst) 
    out = [] 

    while lst: 
     m = 0 
     for i in range(len(lst)): 
      if lst[i][idx[i]] < lst[m][idx[m]]: 
       m = i 
     out.append(lst[m][idx[m]]) 
     idx[m] += 1 
     if idx[m] >= len(lst[m]): 
      del lst[m] 
      del idx[m] 

    return out 


print merge([1,2,11], [2,9], [8]) # [1, 2, 2, 8, 9, 11]