def merge (seq, p, q, r):
# n1: length of sub-array [p..q]
n1 = q - p + 1
# n2: length of sub-array [q+1 ..r]
n2 = r - q
# Left and Right arrays
left_arr = []
right_arr = []
for i in xrange(0, n1):
left_arr.append( seq[p+i] )
for j in xrange(0, n2):
right_arr.append( seq[q+j+1] )
j=0
i=0
for k in xrange(p,r+1):
if left_arr[i]<= right_arr[j]:
seq[k]=left_arr[i]
i+=1
else:
seq[k]=right_arr[j]
j+=1
return seq
s = [2,4,5,7,1,2,3,6]
p = 0
q = 3
r = 7
print merge(s,p,q,r)
使い方:
ソートされていないシーケンス s が、シーケンスをマージする必要があるインデックス番号とともに取得されます。(p=初期、r=最終、q=中間)
ここで、left_arr と right_arr はそれぞれ [p,q]、[q+1, r] です。
left_arr と right_arr の初期値 (i=0、j=0) を取ります。シーケンス seq を反復処理します...
繰り返しながら、seqの値をソートされた値に置き換えています...
上記の関数は、最後の番号「7」までソートできます..最後に、「IndexError」を示します。例外処理を使用してそれをキャッチして修正できますが、マージソートの場合は多すぎると思います.コードをできるだけ簡単に修正するのを手伝ってくれませんか。
私はアルゴリズムを学んでいます.. (次の本: Thomas H. Cormen によるアルゴリズムの紹介)