堆排序
二叉堆的特性
- 最大堆的堆顶是整个堆的最大元素
- 最小堆的堆顶是整个堆的最小元素
堆排序算法的步骤
- 把无序数组构建成二叉堆。需要从小到大排序,则构建成最大堆;需要从大到小排序,则构建成最小堆。时间复杂度O(n)
- 循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。时间复杂度O(nlogn)
def heap_sort(array = []):
for i in range((len(array) - 2) // 2, -1, -1):
down_adjust(i, len(array),array)
for i in range(len(array)-1, 0, -1):
array[i], array[0] = array[0], array[i]
down_adjust(0, i, array)
def down_adjust(parent_index, length, array = []):
temp = array[parent_index]
child_index = 2 * parent_index + 1
while child_index < length:
if child_index + 1 < length and array[child_index + 1] > array[child_index]:
child_index += 1
if temp >= array[child_index]:
break
array[parent_index] = array[child_index]
parent_index = child_index
child_index = 2* child_index + 1
array[parent_index] = temp
my_array = list([3, 4, 14, 1, 5, 6, 7, 8, 9, 1, -1, 0, 9, 11])
heap_sort(my_array)
print(my_array)
- 堆排序的空间复杂度是O(1),时间复杂度O(nlogn)
堆排序与快速排序对比
| 堆排序 | 快速排序 |
|---|
| 平均时间复杂度 | O(nlogn) | O(nlogn) |
| 最坏时间复杂度 | O(nlogn) | O(n2) |
| 平均空间复杂度 | O(logn) | O(1) |
| 是否为稳定排序 | 否 | 否 |