堆排序是一种基于二叉堆数据结构的排序算法。它将待排序的数组看作是一个完全二叉树,并利用堆的性质进行排序。
堆排序的基本思想是先将待排序的数组构建成一个最大堆(或最小堆),然后依次将堆顶元素与堆的最后一个元素交换,然后调整堆,使得剩下的元素重新构成一个最大堆(或最小堆),再次将堆顶元素与堆的最后一个元素交换,如此往复,直到整个数组排序完成。
堆排序的时间复杂度为O(nlogn),其中n为待排序数组的长度。堆排序是一种不稳定的排序算法,因为在交换堆顶元素的过程中可能会改变相同元素的相对顺序。
堆排序的优点是不需要额外的空间,只需要对原数组进行原地排序。缺点是实现较为复杂,且性能受到数据的初始状态影响较大。
下面是一个用Python实现堆排序的代码示例:
```python
def heapify(arr, n, i):
? ? largest = i
? ? l = 2 * i + 1
? ? r = 2 * i + 2
? ? if l < n and arr[l] > arr[largest]:
? ? ? ? largest = l
? ? if r < n and arr[r] > arr[largest]:
? ? ? ? largest = r
? ? if largest != i:
? ? ? ? arr[i], arr[largest] = arr[largest], arr[i]
? ? ? ? heapify(arr, n, largest)
def heapSort(arr):
? ? n = len(arr)
? ? for i in range(n // 2 - 1, -1, -1):
? ? ? ? heapify(arr, n, i)
? ? for i in range(n-1, 0, -1):
? ? ? ? arr[i], arr[0] = arr[0], arr[i]
? ? ? ? heapify(arr, i, 0)
# 测试代码
arr = [12, 11, 13, 5, 6, 7]
heapSort(arr)
print("排序后的数组:", arr)
```
在这个示例中,`heapify`函数用于维护堆的性质,`heapSort`函数用于进行堆排序。通过调用`heapSort`函数,可以对数组进行堆排序,最终得到一个有序数组。