有效的方式在运行中按升序和降序排序

时间:2014-02-28 16:19:42

标签: python sorting big-o

从以下代码中,我使用函数generator创建随机数并帮助模拟传入数据。

from random import randint


def generator(n=1000):
    i = 0
    while i < n:
        yield randint(0, n)
        i += 1

为了按升序排序并且只获得最低的10条记录,我使用它:

out_size = 10
out = []
for num in generator():
    if not len(out):
        out.append(num)
    else:
        for i in range(out_size):
            if num < out[i]:
                out.insert(i, num)
                break
            elif len(out) < out_size:
                out.append(num)
                break

print out[:out_size]

是否有一种有效且更好的方法来对生成的数据进行排序?如何按降序排序。 ?

输入是一个恒定的流,但我只需要保留最低和最高的10条记录。

1 个答案:

答案 0 :(得分:2)

使用heapq.nlargest()heapq.nsmallest()功能;这些使用堆来有效地跟踪最大或最小的K项:

import heapq

out = heapq.nsmallest(10, generator())

堆不变量以O(logK)复杂度维护,K为大小(此处为10); nsmallest函数创建一个大小为K的堆,用前K个元素填充它,然后在一次操作中将每个下一个值推送到每次弹出当前最大值的堆上。

循环N个元素然后使总操作O(N logK),而排序将采用O(N logN)。如果K小于N,则heapq方法获胜。

生成器耗尽后,堆将按排序顺序返回。