我的堆排序代码是否在O(n lgn)时间内运行?只想确认

时间:2018-08-18 06:31:34

标签: python sorting data-structures heapsort

此代码的复杂性是什么?我认为这是O(n lgn),但是我对时间复杂度还比较陌生,所以我只想确定一下。我很确定您也可以使用maxHeap来获得相同的结果,但是我发现使用minHeap更加直观。(我刚刚对此进行了编辑)

def minHeap(array, n, i): #creates minHeap of array and returns it
smallest = i

left = 2*i+1
right = 2*i+2

if left < n:
    if array[smallest] > array[left]:
        smallest = left
if right < n:
    if array[smallest] > array[right]:
        smallest = right



if smallest <> i:
    array[smallest] , array[i] = array[i], array[smallest]
    minHeap(array, n, left)
    minHeap(array, n, right)
    minHeap(array, n, i)
    return array
else:
    if left < n:
        minHeap(array, n, left)
    if right < n:
        minHeap(array, n, right)
    if left < n:
        if array[smallest] > array[left]:
            smallest = left
    if right < n:
        if array[smallest] > array[right]:
            smallest = right
    if smallest <> i:
        array[smallest] , array[i] = array[i], array[smallest]
    return array

def heapSort(arr): #the actual sorting algorithm that uses a minHeap
    minheap = minHeap(arr, len(arr), 0)
    sortedarray = []

    for n in range(0,len(arr)):
        sortedarray.append(minheap[0])
        minheap[0], minheap[-1] = minheap[-1], minheap[0]
        minheap.pop(-1)
        minheap = minHeap(minheap, len(minheap), 0)
    return sortedarray

1 个答案:

答案 0 :(得分:0)

它是O(N²)N的长度为arr

您调用N次的次数是函数minHeap的时间:

for n in range(0,len(arr)):
    ...
    minheap = minHeap(minheap, len(minheap), 0)

该函数minHeap递归地调用i的所有可能值。除了该递归调用之外,minHeap的代码似乎在O(1)中执行。 minHeap的复杂度为O(N)

一个简单的技巧可以让您计算复杂度:计算调用minHeap的次数。在该函数的开头只有一个print(i),您会看到minHeap的时间复杂度与其初始输入的大小成线性关系。

您调用N的时间是O(N)的一个函数,因此总复杂度为O(N²)