堆排序算法(C++版)
2023-12-13 07:21:46
1、介绍
堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法。它的基本思想是先将待排序的元素构建成一个二叉堆,然后依次将堆顶元素与堆中最后一个元素交换,调整堆,重复此过程直到整个数组有序。
2、堆排序步骤
以下是堆排序的主要步骤:
构建堆(Build Heap): 将待排序的数组看作是一个完全二叉树,并从最后一个非叶子节点开始,依次向前调整每个节点,使得每个节点都满足堆的性质(父节点的值大于等于/小于等于其子节点的值,具体取决于是构建最大堆还是最小堆)。
排序(Heapify): 将堆顶元素与堆中最后一个元素交换,然后将堆的大小减一,调整堆使得剩余的元素仍然满足堆的性质。重复这个过程直到堆为空。
3、完整代码
#include <iostream>
#include <vector>
using namespace std;
// 交换数组中两个元素的位置
void swap(vector<int>& arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// 调整堆,确保以root为根的子树满足堆的性质
void heapify(vector<int>& arr, int n, int root) {
int largest = root; // 初始化根节点为最大值
int left = 2 * root + 1; // 左子节点索引
int right = 2 * root + 2; // 右子节点索引
// 比较左子节点与根节点
if (left < n && arr[left] > arr[largest]) {
largest = left;
}
// 比较右子节点与当前最大值
if (right < n && arr[right] > arr[largest]) {
largest = right;
}
// 如果最大值不是根节点,则交换它们,并递归调整被影响的子树
if (largest != root) {
swap(arr, root, largest);
heapify(arr, n, largest);
}
}
// 堆排序主函数
void heapSort(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--) {
swap(arr, 0, i);
heapify(arr, i, 0);
}
}
int main() {
vector<int> arr = {12, 11, 13, 5, 6, 7};
cout << "Original array: ";
for (int num : arr) {
cout << num << " ";
}
cout << endl;
// 调用堆排序函数
heapSort(arr);
cout << "Sorted array: ";
for (int num : arr) {
cout << num << " ";
}
cout << endl;
return 0;
}
文章来源:https://blog.csdn.net/WwLK123/article/details/134880024
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!