Python 使用合并排序的反转计数
我正在尝试实现著名的:使用合并排序计算反转。 我写了同样的代码。该代码适用于小数据。我用了几个测试用例来验证答案。但是,当输入量很大时,代码需要很长时间。所以,我只想确保我的代码的复杂性在lgN上,而不是更高的复杂性,因为它可能需要更长的时间。 以下是我用Python编写的代码:Python 使用合并排序的反转计数,python,sorting,time-complexity,mergesort,Python,Sorting,Time Complexity,Mergesort,我正在尝试实现著名的:使用合并排序计算反转。 我写了同样的代码。该代码适用于小数据。我用了几个测试用例来验证答案。但是,当输入量很大时,代码需要很长时间。所以,我只想确保我的代码的复杂性在lgN上,而不是更高的复杂性,因为它可能需要更长的时间。 以下是我用Python编写的代码: def merge_sort(u_list,inv): if(len(u_list) == 1): return 0 if(len(u_list)>1): mid=len(
def merge_sort(u_list,inv):
if(len(u_list) == 1): return 0
if(len(u_list)>1):
mid=len(u_list)//2
l_list=u_list[:mid]
r_list=u_list[mid:]
a=merge_sort(l_list,inv)
b=merge_sort(r_list,inv)
count=0
i=0
j=0
k=0
track=0
while i<len(l_list) and j<len(r_list) :
if l_list[i]<=r_list[j]:
u_list[k]=l_list[i]
track+=1
i+=1
k+=1
else: #r_list[j]<l_list[i]
u_list[k]=r_list[j]
inv=inv+(len(l_list)-track)
j+=1
k+=1
while i<len(l_list) :
u_list[k]=l_list[i]
i+=1
k+=1
while j<len(r_list):
u_list[k]=r_list[j]
j+=1
k+=1
count=inv+a+b
return count
inv=0
m=0
u_list=[]
x=0
for m in range(0,100000):
x=int(input())
u_list.append(x)
foo = merge_sort(u_list,inv)
print(foo)
我换了
for m in range(0,100000):
x=int(input())
u_list.append(x)
与
然后运行代码,花了大约一秒钟,这似乎很正常。我认为您的合并排序很好,输入出现了问题。如何将输入传递到脚本?如果在某个大文本文件中进行流式传输,是否可能该文件没有100000行,而程序只是永远等待?由于我在文本文件中输入数据,因此我替换了:
x=0
for m in range(0,100000):
x=int(input())
u_list.append(x)
为此:
fileName = 'IntegerArray.txt'
u_list = []
with open(fileName) as f:
for line in f:
u_list.append(int(line))
并在大约一秒钟内得到输出。您能分析一下您的代码吗?i、 你确定它没有在输入上花费太多的时间吗?我看不出任何错误,所以我同意问题可能在阅读和解析输入上。在foo=merge\u sortu\u list,inv之前进行打印,以确保它已完成该阶段并正在排序。相关:在日志n实现中,实际上我正在使用www.ideone.com。我认为这不是最好的方法。是的,我意识到输入有问题。我已经发布了更正的版本。谢谢你的帮助。
fileName = 'IntegerArray.txt'
u_list = []
with open(fileName) as f:
for line in f:
u_list.append(int(line))