此代码的复杂性是什么?我认为这是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
答案 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²)
。