我在pyhton中创建了一个用于计数反转的程序,并使用python27进行相同的操作。我使用分而治之技术(合并排序技巧)实现了算法。我的程序运行正常,大小为100的输入数组(这是我可以验证的最大值)。 现在我在一个大小为50,000和1,00,000的输入数组上测试了我的程序但是我怎么也得不到正确的答案。我已粘贴下面的代码,请指出任何可能的错误:
f=open('forum.txt')
a=[]
s=1
for line in f:
a.append(line)
def CountInversion(IntegerArray):
_count=0
lc=0
rc=0
RightArray=[]
LeftArray=[]
if len(IntegerArray)>1:
LeftArray,lc=CountInversion(IntegerArray[:len(IntegerArray)/2])
RightArray,rc=CountInversion(IntegerArray[len(IntegerArray)/2:])
elif len(IntegerArray)==1:
return IntegerArray,0
ResultArray=IntegerArray
i=0
l=len(ResultArray)
j,k=0,0
for i in range(0,l):
if j<len(RightArray) and k<len(LeftArray):
if RightArray[j]<LeftArray[k]:
ResultArray[i]=RightArray[j]
j += 1
a=(len(LeftArray)-k)
_count = _count + a
else:
ResultArray[i]=LeftArray[k]
k += 1
elif j<len(RightArray):
ResultArray[i]=RightArray[j]
j += 1
elif k<len(LeftArray):
ResultArray[i]=LeftArray[k]
k += 1
return ResultArray,(_count+lc+rc)
arr,b=CountInversion(a)
print ('end of inversions')
print b
我还运行了J.F.Sebastian在this帖子中给出的代码,但结果相同(答案对于小输入是正确的,但对于大小为50000或1,00,000的输入数组则不正确)
答案 0 :(得分:0)
您的第一个问题是您的缩进不一致。在几行上你使用制表符而不是空格,这是一个非常糟糕的主意。缩进在Python中很重要,因此如果不注意,很容易出错。
我认为你遇到的第二个问题是你在比较字符串而不是数字。 Python非常乐意对字符串进行排序,但它会使用词典编纂,当应用于编码为字符串的整数时,这可能会出乎意料。例如,字符串"11"
将在字符串"2"
之前排序,因为它的第一个字符1
位于ASCII字符集中的2
之前(以及Unicode中)
正如我在评论中提到的,目前尚不清楚您是如何确定代码无法正常工作的。可能只是简单地解决我上面描述的问题就可以解决你遇到的问题。如果他们不这样做,请解释您如何确定结果无效,我会尝试更新此帖子并提供进一步的建议。
答案 1 :(得分:0)
通过将字符串解析为int并填充数组
来解决问题