【问题标题】:Python Merge AlgorithmPython 合并算法
【发布时间】:2015-07-18 01:20:23
【问题描述】:

这似乎现在起作用了...欢迎公开批评。 Ty tsroten。

debug = 1
#List to be merged
A=[1,2,3,4,5,6,1,2,3,4,5,6,7]

#Artificial variables from calling function
p=0
r=len(A)
q=int(((p+r)/2)-1)

#List to append merged values
B=[]

#End of list
end=len(A)

if debug:
    print ('Mid: %d\n' % (q))
    print ('End: %d' % (end))

#Left and Right lists with sentinels
L=A[:q+1]
R=A[q+1:]
L.append(None)
R.append(None)

#Init counters
i=k=j=l=0

if debug:
    print ('A:%s' %(A))
    print ('\n')
    print ('L:%s' %(L))
    print ('R:%s' %(R))
    print ('\n')

#Merge Left and Right lists
for k in A:
    if debug:
        print ('Iteration:%d' % (l))
        l+=1
        print ('i=%d, j=%d' % (i, j))
        print ('B:%s' %(B))
        print ('\n')
    if L[i] is not None and L[i]<=R[j]:
        B.append(L[i])
        i+=1
    else:
        B.append(R[j])
        j+=1

print ('Result:',B)

我正在尝试用 Python 编写一个合并算法,但我一直遇到这个错误。

Traceback (most recent call last):
  File "C:/Python34/Scripts/mergeSort.py", line 19, in <module>
    if L[i]<=R[j] and i<mid:
IndexError: list index out of range

我查看了其他算法,但它们似乎没有同样的问题。请帮忙。

A=[2,4,5,7,1,3,7,8,9]  
B=[]


end=len(A)  
mid=int(end/2)

L=A[:mid]  
R=A[mid+1:]

i=k=j=0

for k in A:  
    if L[i]<=R[j] and i<mid:  
        B.append(L[i])  
        i+=1  
    elif j<end:  
        B.append(R[j])  
        j+=1  

print (B)

【问题讨论】:

  • B = L + R 有任何问题,或者您只是在探索替代方案?
  • 这更像是一种锻炼我的算法知识的练习,而不是寻找最简单的方法。我最终将把它结合起来形成一个合并排序算法。

标签: python algorithm merge mergesort


【解决方案1】:

您的for 循环遍历A 中的所有项目,该循环比LR 长。因此,在某些时候,ij 变得大于 LR 的长度。此时,引用 L[i]R[j] 会引发 IndexError

【讨论】:

  • 我明白你在说什么,但我原以为条件句 'i
  • len(R) != end 那么,j &lt; end 真的对你有帮助吗?
  • 我将 j
  • IndexError 指的是L[i],而不是R[j]。假设i == mid - 1。然后,它满足条件并递增,以便i == mid。现在,L[i] 提出了一个 IndexError
  • 为什么不在代码中添加一些基本的print() 调用来帮助您调试。开头可能是print(mid)。然后,在for 循环的开头:print('i: %s, j: %s' % (i, j))print('L[i]: %s' % L[i])print('R[j]: %s' % R[j])
【解决方案2】:

您应该在调用该索引之前检查 i 和 j 是否为入站。

【讨论】:

    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多