我正在尝试实现这个着名的:使用合并排序计算反转。 我为此编写了代码。该代码适用于小数据。我有几个测试用例,我用它来验证答案。但是当输入很大(100000)时,代码需要很长时间。所以,我只是想确保我的代码的复杂性是O(N lgN)而不是更高(复杂度更高,可能需要更长的时间)。 这是我在Python中的代码:
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)
答案 0 :(得分:0)
我替换了
from random import *
u_list = list(range(100000))
shuffle(u_list)
与
{{1}}
并运行代码,它花了大约一秒钟,这似乎正常。我认为你的合并排序很好,输入上出了问题。你是如何将输入传递给脚本的?如果你在一些大文本文件中流式传输,那么该文件可能不是100000行而程序只是永远等待?
答案 1 :(得分:0)
由于我在文本文件中输入了数据,因此我将其替换为:
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))
并在一秒左右得到输出。