Python的sort()/ sorted()函数是否调用其可选的'key'参数O(n)次或O(n log n)次?

时间:2013-10-14 02:04:52

标签: python sorting time-complexity

假设apples是n个苹果的列表,我有一个函数apple_evaluator(apple)来评估苹果的“优点”。要按“善”排序apples,请使用apples.sort(key = apple_evaluator)sorted(apples, key=apple_evaluator)

apple_evaluator调用O(n)次(例如,对apple_evaluator(apple)中的每个apple进行Python预计算apples,然后使用这些值对apples进行排序)或O(n log n)次(例如Python计算每次排序进行比较时重新计算apple_evaluator值)?

2 个答案:

答案 0 :(得分:5)

试试:

count = [0]

def _sort_key(x):
    count[0] += 1
    return x


a = list(np.random.rand(12))

print count
a.sort(key=_sort_key)
print count, len(a)

答案是O(n)。

答案 1 :(得分:4)

cmp替换key的重点是对关键函数进行O(n)调用。这称为Schwartzian transform或decorate-sort-undecorate

key参数出现之前,发现cmp几乎无用,因为执行此过程效率更高。其中f是关键功能

L = [(f(i), i) for i in L]                           ## decorate
L.sort()    # there was no "sorted()" at the time    ## sort
L = [i[1] for in L]                                  ## undecorate