反转计数使用合并排序

时间:2015-10-18 23:33:30

标签: python sorting time-complexity mergesort

我正在尝试实现这个着名的:使用合并排序计算反转。 我为此编写了代码。该代码适用于小数据。我有几个测试用例,我用它来验证答案。但是当输入很大(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)

2 个答案:

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

并在一秒左右得到输出。