私はこれをやろうとして何時間も費やしました。誰かが私の間違いを指摘できますか?Pythonを使用したBottom Up MergeSort
a
は単なるリストで、tmp
はサイズlen(a)
z
の空のリストは、基本的にlen(a)
a = [6,5,4,3,2,1] print 'unsorted:',a z = len(a) tmp = range(len(a))
である。ここで私のソート機能です:
def sort(a,tmp):
width=1
while(width<z):
p=0
while(p<z):
left =p
middle = p+width
right = p+2*width
merge(a,left,middle,right,tmp)
p = p+2*width
t=0
while(t<z):
a[t]=tmp[t]
t=t+1
width=width*2
print '\n'
、ここでは、マージです関数:
def merge(a,iLeft,iMiddle,iRight,tmp):
i = iLeft
j = iMiddle
k = iLeft
print iLeft,iMiddle,iRight,'[',i,j,k,']'
#print i ,j, k,'\n\n'
while(i<iMiddle or j<iRight):
if(i<iMiddle and j<iRight):
if(a[i]<a[j]):
tmp[k]=a[i]
i += 1
k += 1
else:
tmp[k]=a[j]
j += 1
k += 1
elif (i==iMiddle):
tmp[k] = a[j]
j += 1
k += 1
elif (j==iRight):
tmp[k]= a[i]
i += 1
k += 1
[この視覚化]が役立ちます。私はまだそれがなぜこのように作用しているのか分からない。
どこが間違っているのかわからないのですか?インデントかループですか?
Output ::
unsorted: [6, 5, 4, 3, 2, 1]
0 1 2 [ 0 1 0 ]
2 3 4 [ 2 3 2 ]
4 5 6 [ 4 5 4 ]
0 2 4 [ 0 2 0 ]
4 6 8 [ 4 6 4 ]
Traceback (most recent call last):
File "BUmer.py", line 45, in <module>
sort(a,tmp)
File "BUmer.py", line 14, in sort
merge(a,left,middle,right,tmp)
File "BUmer.py", line 27, in merge
if(a[i]<a[j]):
IndexError: list index out of range
This visualizationが役に立ちます。なぜこれが起こっているのかまだ分かりません。
あなたはどんな出力を得ていますか、どのように期待どおりに違いますか。 –
Zはソート関数で定義されていません。あなたの2番目の関数でkはiLeftですが、iRightを意味する可能性が最も高いです。 – gnicholas