在python中使用非常大的数字排序列表的最佳算法是什么

时间:2017-09-29 07:47:01

标签: python python-2.7

n=input() ##0<n<10000
m=[]
for i in range(n):
    m.append(input())
m.sort()
for i in range(n):
    print m[i]

通过使用此代码,如果列表中的每个数字都小于10 ^ 20,我可以轻松地从列表中获取输出。但是当列表包含大量数字(如10 ^ 50)时,我该怎么做才能对列表进行排序?

1 个答案:

答案 0 :(得分:2)

简短回答:一个小于500000项的整数列表在排序小数字与排序大数字时的性能差异可以忽略不计。 百万项中的整数列表将根据列表中的整数范围具有大不相同的排序时间。

一组快速基准:

list1 = A list of N integers of range 0-100000

list2 = Another list of N integers of range 0-10**50

使用{3.5}运行的list.sort()进行排序。

当N为5000时,两个列表的排序时间均为0.0秒

当N为50000时,排序时间为.014和.016秒(可忽略不计)

当N为500000时,排序时间为.17和.23秒(50%delta,但仍然可以忽略不计)。

当N为5000000时,排序时间为2.1秒和3.6秒(71%delta,显着差异)

结论:如果列表大小小于500K整数,则无论整数范围如何,排序时间都可以忽略不计。 op的代码暗示N小于10K。

一旦你进入“数百万整数”的列表,我们就会开始看到更多波动,特别是使用不同的python解释器。

def createRandomNumber(number_of_digits):
    x = 0
    number_of_digits = int(number_of_digits)
    for i in range(number_of_digits):
        x = x*10 + int(10 * random.random())
    return x

def createRandomNumberList(max_digits, count):
    l = []
    for i in range(count):
        l.append(createRandomNumber(random.random()*max_digits+1))
    return l


list1 = createRandomNumberList(5,  50000)
list2 = createRandomNumberList(50, 50000)


print("sorting list1")
start1 = time.time()
list1.sort()
end1 = time.time()


print("sorting list2")
start2 = time.time()
list2.sort()
end2 = time.time()

print("time to sort list1: ", end1-start1)
print("time to sort list2: ", end2-start2)