merge 實現

  今天寫了個小程序,作兩個已經從小到大排序好的數據的merge。小程序

要求: listA = (1, 3, 5, 10); listB = (4, 6, 12);listA 和listB都是排序由小到大的列表,元素個數不限。app

寫代碼將listA 按照由小到大的順序合併,不去重。spa

第一輪代碼以下:code

def merge(A, B):
    if len(A)==0:
        return B
    if len(B)==0:
        return A

    result = []
    for itemA in A:
        for itemB in B:
            if itemA < itemB:
                print itemA, "<", itemB,  '--------->insert itemA:', itemA
                result.append(itemA)
        
            else:
                print itemA, ">", itemB, '--------->insert itemB:', itemB
                result.append(itemB)        
                
    return result


Alist = [1, 2, 3, 7, 8]
Blist = [4, 6]

print merge(Alist, Blist)
                

可想而知,獲得的結果天然是不正確的。 blog

 

問題呢? 很顯然,break 跳出了循環後,再進入的時候,還會從B的開始查起,這樣有的元素就會屢次被查到,而在insertB的時候,也會丟掉A的循環。最終的數據結果是,A的元素丟失,B的元素屢次被插入。排序

那如何爭取解決問題呢?it

下面這個代碼寫的很繁複,可是實現了基本功能。class

def merge(A, B):
    if len(A)==0:
        return B
    if len(B)==0:
        return A

    result = []
    lenA = len(A)
    lenB = len(B)
    currentAIndex = 0
    currentBIndex = 0
   
    for i in range(currentAIndex, lenA):
        for j in range(currentBIndex, lenB):
            if A[i] < B[j]:
                print A[i], "<", B[j],  '--------->insert itemA:', A[i]
                result.append(A[i])
                currentAIndex = currentAIndex+ 1
                break
            else:
                print A[i], ">", B[j], '--------->insert itemB:', B[j]
                result.append(B[j])
                currentBIndex = currentBIndex+ 1

    while currentAIndex <lenA:
        result.append(A[currentAIndex])
        currentAIndex = currentAIndex+ 1

    while currentBIndex <lenB:
        result.append(B[currentBIndex])
        currentBIndex = currentBIndex+ 1

                
    return result


Alist = [1, 7, 8]
Blist = [4, 6, 9, 10]
print merge(Alist, Blist)
相關文章
相關標籤/搜索