这是我用于合并排序的Python代码,我无法理解为什么我在第23行得到IndexError
。
第23行如果放在for
循环之前但在for
循环中显示为list index out of range
,则不会出错。 :(
from math import floor
def merge_sort(a,p,r):
if p < r:
q = (p+r)/2
merge_sort(a,p,q)
merge_sort(a,q+1,r)
merge(a,p,q,r)
def merge(A,p,q,r):
n1 = q - r +1
n2 = r - q
L = []
R = []
#print n1
for i in range (1,n1):
L.append(a[p+i-1])
for j in range (1,n2):
R.append(a[q+j])
L.append(10000)
R.append(10000)
i,j=0,0
for k in range (p,r):
if L[i] <= R [j]: # This is where the error occurs
A[k] = L[i]
i = i + 1
else :
A[k] = R[j]
j = j + 1
a=[1,4,9,8,2,3,8,2,9]
merge_sort(a,1,len(a))
print a
答案 0 :(得分:0)
这不是python,这是带有Python语法的Pascal。
以下是合并排序算法的实现(基于Merge sort wiki article):
def merge_sort(data):
if len(data) <= 1:
return data
middle = len(data) / 2
left = merge_sort(data[0:middle])
right = merge_sort(data[middle:])
return merge(left, right)
def merge(left, right):
result = []
while left or right:
if left and right:
if left[0] <= right[0]:
result.append(left.pop(0))
continue
result.append(right.pop(0))
continue
if left:
result.append(left.pop(0))
elif right:
result.append(right.pop(0))
return result
data = [1, 4, 9, 8, 2, 3, 8, 2, 9]
result = merge_sort(data)
assert len(data) == len(result)
print result
答案 1 :(得分:0)
我同意评论者/其他海报,这个脚本有一个Python语法(除了不是习惯性的4个空格的缩进......)但是远来自Pythonic ...
无论如何,对于您的问题:merge
时(p,q,r)=(1,2,3)
中出现问题。在这种情况下,n1=0
和n2=1
。循环range(1,n1)
将无法获取任何内容,因此您的L
将只有1个元素(您在循环外附加10000
)。
现在,当你到达for k in range (p,r)
循环:
k=p=1
,L[0] <= R[0]
并将1
添加到i
,因此i
= 1 L[i]
,即L[1]
。因此,IndexError
。一些建议: