目录
1、简述
堆排序(Heap Sort)是一种基于二叉堆(Binary Heap)数据结构的比较排序算法。它将待排序的数组构造成一个堆,分为最大堆和最小堆,常用的是最大堆。通过反复取出堆顶元素(即最大元素)并调整堆结构来达到排序的目的。
实现步骤
-
构建最大堆:
- 从数组的中间元素开始,向前遍历对每个子树执行堆化操作,使之满足最大堆的性质(父节点大于或等于子节点)。
-
堆排序:
- 交换堆顶元素(最大值)和堆的最后一个元素,将最大值放在数组末尾。
- 减少堆的大小,并对堆顶元素执行堆化操作,重新调整堆结构。
- 重复上述步骤直到堆的大小减少到1。
2、复杂度
-
时间复杂度:
- 构建最大堆:O(n)
- 堆排序过程:O(n log n)
- 总体时间复杂度:O(n log n)
-
空间复杂度:
- O(1),由于堆排序是在原地进行的,不需要额外的存储空间。
3、稳定性
堆排序是一种不稳定的排序算法,因为在堆化过程中,元素的相对位置可能会发生改变。
4、例子
#include <iostream>
#include <vector>
void heapify(std::vector<int>& arr, int n, int i) {
int largest = i; // 初始化最大元素为根节点
int left = 2 * i + 1; // 左子节点
int right = 2 * i + 2; // 右子节点
// 如果左子节点大于根节点
if (left < n && arr[left] > arr[largest])
largest = left;
// 如果右子节点大于当前最大值
if (right < n && arr[right] > arr[largest])
largest = right;
// 如果最大值不是根节点
if (largest != i) {
std::swap(arr[i], arr[largest]);
// 递归地堆化子树
heapify(arr, n, largest);
}
}
void heapSort(std::vector<int>& arr) {
int n = arr.size();
// 构建最大堆
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
// 逐个从堆顶取出元素,并对剩余部分进行堆化
for (int i = n - 1; i > 0; i--) {
std::swap(arr[0], arr[i]); // 将当前堆顶元素移动到数组末尾
heapify(arr, i, 0); // 对剩余部分进行堆化
}
}
// 测试代码
int main() {
std::vector<int> array = {12, 11, 13, 5, 6, 7};
heapSort(array);
std::cout << "Sorted array is \n";
for (int num : array)
std::cout << num << " ";
std::cout << std::endl;
return 0;
}
快捷跳转:
生命不息,学习不止,若有不正确的地方,欢迎指正。