此实现计数排序的时间复杂度

时间:2019-04-25 17:55:22

标签: python time-complexity

我必须确定给定计数排序代码的时间复杂度。我知道计数排序应该是O(n + k),但是我看不到这个函数是O(n + k),因为第二个for循环中有一个for循环。

def counting_sort(array, k): # k is max(array)

    count = (k+1) * [0]  
    sorted = []
    for i in array:
        count[i] += 1
    for i in range(len(count)):
        if count[i] != 0:
            sorted += [i for j in range(count[i])]
    return sorted

如果元素是唯一的,最坏的情况不是n + k ^ 2吗?

1 个答案:

答案 0 :(得分:2)

第一个循环

for i in array:
    count[i] += 1

进行n次迭代,第二个循环中的指令数 对于列表理解,在最坏的情况下执行:

i for j in range(count[i]) #

count[i],并且所有count[i]的总和等于n。 请注意,比较

        if count[i] != 0:

完成k次,在最坏的情况下

sorted +=...

也做了k次。将所有这些加在一起,就可以得到O(n + k)

(假设sorted的+ =是常数成本,否则我们必须说+ =是摊销常数,因此结果带有警告性。)