If I have a list and need to sort it, is there a good reason to use list.sort() over heapq.heapify(list), given that heapify is O(N) (link) and .sort() is O(NlogN)?
Why isn't the default sort algorithm heapify if heapify is faster?
CodePudding user response:
as guys have said in the comment section, "heapify" rearranges elements of the list to form a heap-oriented binary tree.
bad sorting is usually done using O(n * n) so having O(n * logn) makes it way faster. most of the good sorting libraries do sorting in n * logn time.
you can use heaps to sort your array in n*logn time like:
import heapq
a = [3, 6, 1, 3, 7, 9]
def sort_with_heap(a):
"""
sort O(nlogn)
"""
heapq.heapify(a) # heapify's the list O(n)
while len(a) > 0: # O(n) times
yield heapq.heappop(a) # O(logn)
print(list(sort_with_heap(a)))
>> [1, 3, 3, 6, 7, 9]
note: that the example above is for the sake of understanding how heaps can be used for sorting and is not space optimal. to do proper sorting using heaps take a look at heapsort (which works with max-oriented heaps) and doesn't use any additional space than the sorting array itself. i've wrote one myself in here.
