をスライスせずにマージソートが、私は、実行時の途中での問題に実行しているよ - 私は間違って私は「Pythonはアイブ氏は、スライシングを使用せずにクイックソートの実装を作成しようとし
を行くよどこ誰もが私を見ることができればと思いまして(コメントアウト)いくつかのprint文を追加しましので、あなたは前に起こっていただきました!見ることができ、各ステージの後:
def mergesort(arr, l, r):
#print('start: ', arr[l:r])
if len(arr[l:r]) <=1:
return arr[l:r]
mid = l + (r-l) // 2
left = mergesort(arr, l, mid)
right = mergesort(arr, mid, r)
l_idx = l
r_idx = mid
final = []
while l_idx < mid and r_idx < r:
if arr[l_idx] <= arr[r_idx]:
final.append(arr[l_idx])
l_idx+=1
else:
final.append(arr[r_idx])
r_idx+=1
for val in arr[l_idx:mid]:
final.append(val)
for val in arr[r_idx:r]:
final.append(val)
#print('final: ', final[l:r])
#print()
#print()
return final
print(merge([0, 9, 3, 7, 4, 2, 6, 1], 0, 8))
私は左サイドを持っていたため、それがうまく機能していることショーを取得していた値が、右のそれのためにしません。左の右側のために働くように見えるので、好奇心旺盛です...
stdoutがある:
start: [0, 9, 3, 7, 4, 2, 6, 1]
start: [0, 9, 3, 7]
start: [0, 9]
start: [0]
start: [9]
final: [0, 9]
start: [3, 7]
start: [3]
start: [7]
final: []
final: [0, 3, 7, 9]
start: [4, 2, 6, 1]
start: [4, 2]
start: [4]
start: [2]
final: []
start: [6, 1]
start: [6]
start: [1]
final: []
final: []
final: [0, 4, 2, 6, 1, 9, 3, 7]
ありがとうございます。インデックスを再調整するロジックを説明してください、「中= =」とr = = l 'ありがとうございます。 – vitamike
'l:r'はあなたが作業している' arr'の範囲ですが、返された 'left'と' right'リストはこの情報を反映しません。 'left + right'は' r - l'要素を持っていますが、索引 'l'ではなくインデックス0(当然)から始まります。だから、あなたが使用しているすべてのインデックスは 'l'単位以下でなければなりません。それは ' - = l'のことです:左側の名前から' l'を引きます。 – trincot
ありがとう、もう一度ありがとう:-) – vitamike