def heapsort(arr): """ :description: heapsort, version not in place b/c the heap ops don't take heap size parameter. Works by removing largest element and calling max_heapify :time: O(nlgn) worst case calls max_heapify n times :space: O(n) """ heap = arr heap_ops.build_max_heap(heap) sorted_arr = [] for i in range(len(arr) - 1): heap[0], heap[-1] = heap[-1], heap[0] sorted_arr.append(heap.pop()) heap_ops.max_heapify(heap, 0) sorted_arr.append(heap.pop()) return list(reversed(sorted_arr))
""" heap_increase_key(heap, i, heap_max(heap) + 1) heap_extract_max(heap) def max_heap_insert(heap, value): """ :description: insert an element into the heap :time: O(lgn) """ heap.append(-sys.maxint) heap_increase_key(heap, len(heap) - 1, value) if __name__ =='__main__': data = [1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,5,4,3,2,1,2,3,4,5] heap_ops.build_max_heap(data) result = heap_max(data) == max(data) print 'correct?: {}'.format(result) data = [1,2,3] heap_ops.build_max_heap(data) max_value = heap_extract_max(data) result = max_value == 3 print 'correct?: {}'.format(result) result = data == [2,1] print 'correct?: {}'.format(result) data = [1,2,3] heap_ops.build_max_heap(data) heap_increase_key(data, 2, 10) result = data == [10, 2, 3] or data == [10, 3, 2]
def max_heap_insert(heap, value): """ :description: insert an element into the heap :time: O(lgn) """ heap.append(-sys.maxint) heap_increase_key(heap, len(heap) - 1, value) if __name__ == '__main__': data = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5 ] heap_ops.build_max_heap(data) result = heap_max(data) == max(data) print 'correct?: {}'.format(result) data = [1, 2, 3] heap_ops.build_max_heap(data) max_value = heap_extract_max(data) result = max_value == 3 print 'correct?: {}'.format(result) result = data == [2, 1] print 'correct?: {}'.format(result) data = [1, 2, 3] heap_ops.build_max_heap(data) heap_increase_key(data, 2, 10) result = data == [10, 2, 3] or data == [10, 3, 2]