在计算机科学中,堆排序是一种高效的比较类排序算法,它利用了堆这种数据结构的特性。本教程将手把手教你如何用C++语言实现堆排序算法,即使你是编程小白,也能轻松理解并掌握!
堆是一种特殊的完全二叉树,分为两种:
堆排序通常使用最大堆来实现升序排序。
堆排序主要分为两个步骤:
下面我们用C++一步步实现堆排序。整个过程包括两个核心函数:
heapify():用于维护堆的性质heapSort():主排序函数#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); }}// 打印数组void printArray(const std::vector<int>& arr) { for (int num : arr) std::cout << num << " "; std::cout << std::endl;}// 主函数测试int main() { std::vector<int> arr = {12, 11, 13, 5, 6, 7}; std::cout << "原始数组: "; printArray(arr); heapSort(arr); std::cout << "排序后数组: "; printArray(arr); return 0;} 1. heapify 函数:确保以索引 i 为根的子树满足最大堆性质。它会比较根节点与其左右子节点,若子节点更大,则交换并递归处理被影响的子树。
2. 构建初始堆:从最后一个非叶子节点(索引为 n/2 - 1)开始向前遍历,依次调用 heapify,从而将整个数组构建成最大堆。
3. 排序过程:每次将堆顶(最大值)与当前未排序部分的最后一个元素交换,然后对新的堆顶执行 heapify,使剩余元素重新满足堆性质。
通过本教程,你已经掌握了C++堆排序算法的完整实现。堆排序是一种高效、原地的排序算法,适用于对性能要求较高的场景。无论你是学习数据结构堆排序,还是准备面试,掌握堆排序都是非常有价值的技能。
关键词回顾:C++堆排序算法、堆排序实现、C++排序教程、数据结构堆排序。
本文由主机测评网于2025-12-14发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025127477.html