-1

ここに、マージソートを使用してリストをソートするためのコードがあります..ネットのどこかで入手したばかりです..しかし、正直なところ、コードの流れをたどることができません...つまり、それがどのようになっているのかわかりません実装されました。一部の部分、特にリスト全体を2つに分割し、リストの両側をソートする最初の部分を理解できます。そして、何?? ここで何が起こっているのか教えてください。ありがとうございました。:)

def merge(badlist):
    if len(badlist) == 1:  
    return badlist  
    m = len(badlist)/2  
    l = merge(badlist[:m])  
    r = merge(badlist[m:])  
    if not len(l) or not len(r):  
        return l or r  
    result = []  
    i = j = 0  
    while (len(result) < len(r) + len(l)):  
        if l[i] < r[j]:  
            result.append(l[i])  
            i += 1  
        else:  
            result.append(r[j])  
            j += 1  
        if i == len(l) or j == len(r):  
            result.extend(l[i:] or r[j:]) 
            break  
    return result  
print merge(badlist)  
4

1 に答える 1

1

行ごとに進み、

if not len(l) or not len(r):  
        return l or r

これにより、リストのいずれかが空かどうかがチェックされます。そうであれば、他のリストが返されます。

result = []  
i = j = 0  

ここでとresultが初期化されますij

while (len(result) < len(r) + len(l)):  

while両方のリストのすべての要素がリストにコピーされるまでループを実行しますresult

    if l[i] < r[j]:  
            result.append(l[i])  
            i += 1  
    else:  
            result.append(r[j])  
            j += 1  

このブロックは、 または のl[i]どちらr[j]が小さいかをチェックし、それを に追加してresult、それぞれのカウンターを進めます。これは、リストのいずれかが完全に使い果たされるまで続きます。これは、次のコード ブロックでチェックされます。

    if i == len(l) or j == len(r):  
            result.extend(l[i:] or r[j:]) 
            break 

これで、まだ要素が含まれているリストがそのままリストの末尾に追加されresultます。

return result

その後、result返されます。

前述のように、サンプルのインデントが正しくないため、ここで修正しました。

于 2013-02-05T07:47:32.773 に答える