Я потратил бесчисленные часы, пытаясь это сделать. Может ли кто-нибудь указать на мою ошибку?Bottom Up MergeSort с использованием Python
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 не определен в вашей функции сортировки. k - iLeft в вашей второй функции, но вы, скорее всего, имели в виду iRight. – gnicholas