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(

我正在尝试实现著名的:使用合并排序计算反转。 我写了同样的代码。该代码适用于小数据。我用了几个测试用例来验证答案。但是,当输入量很大时,代码需要很长时间。所以,我只想确保我的代码的复杂性在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)
我换了

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))