如何使用C++实现堆排序算法

一、什么是堆排序算法

堆排序算法是一种基于完全二叉树的排序算法,它指定了一个最大/最小堆的概念,通过不断将根节点移动到数组的末尾,并对余下的元素重建堆,最后达到排序的目的。堆排序算法的时间复杂度为O(nlogn)。

二、堆排序算法的实现步骤

1. 构建初始堆:将n个元素构建成初始堆,从最后一个非叶子结点开始,自下而上执行堆调整(maxHeap)。

2. 将堆顶元素放到末尾:交换堆顶元素和序列末尾元素,堆大小减1。

3. 重建堆:对新的堆顶元素进行heapify操作(maxHeap),将其放到正确的位置。

4. 重复上述步骤,直到堆大小为1。

三、C++实现堆排序算法

#include <iostream>
#include <vector>
using namespace std;

// 构建初始堆
void maxHeapify(vector<int>& nums, int heapSize, int index) {
    int left = 2 * index + 1;
    int right = 2 * index + 2;
    int largest = index;
    if (left < heapSize && nums[left] > nums[largest]) {
        largest = left;
    }
    if (right < heapSize && nums[right] > nums[largest]) {
        largest = right;
    }
    if (largest != index) {
        swap(nums[index], nums[largest]);
        maxHeapify(nums, heapSize, largest);
    }
}

// 堆排序
void heapSort(vector<int>& nums) {
    int n = nums.size();
    // 构建初始堆
    for (int i = n / 2 - 1; i >= 0; i--) {
        maxHeapify(nums, n, i);
    }
    // 将堆顶元素放到末尾,重建堆
    for (int i = n - 1; i > 0; i--) {
        swap(nums[0], nums[i]);
        maxHeapify(nums, i, 0);
    }
}

int main() {
    vector<int> nums = {4, 1, 3, 2, 5, 6};
    heapSort(nums);
    for (int num : nums) {
        cout << num << " ";
    }
    return 0;
}

四、堆排序算法的优化

堆排序算法可以有许多优化,比如使用最小堆代替最大堆,使用堆内存储的元素下标代替额外空间存储堆元素,使用堆化的方式构建初始堆等等。

其中,使用堆化的方式构建初始堆可以减少时间复杂度,堆化方式有自上而下的堆化和自下而上的堆化。自上而下的堆化相比自下而上的堆化来说,需要更多的swap操作,但在堆偏小的情况下会比较适用。

// 自上而下的堆化
void maxHeapify(vector<int>& nums, int heapSize, int index) {
    int left = 2 * index + 1;
    int right = 2 * index + 2;
    int largest = index;
    while (left < heapSize) {
        if (nums[left] > nums[largest]) {
            largest = left;
        }
        if (right < heapSize && nums[right] > nums[largest]) {
            largest = right;
        }
        if (largest != index) {
            swap(nums[index], nums[largest]);
            index = largest;
            left = 2 * index + 1;
            right = 2 * index + 2;
            largest = index;
        } else {
            break;
        }
    }
}

五、总结

堆排序算法是一种快速稳定的排序算法,通过构建最大/最小堆的方式对无序序列进行排序。C++实现堆排序只需要实现maxHeapify和heapSort两个函数,便可以对序列进行排序。在实际应用中,还可以通过堆化方式构建初始堆,进一步提高堆排序的效率。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/239104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:14
下一篇 2024-12-12 12:14

相关推荐

  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python实现爬楼梯算法

    本文介绍使用Python实现爬楼梯算法,该算法用于计算一个人爬n级楼梯有多少种不同的方法。 有一楼梯,小明可以一次走一步、两步或三步。请问小明爬上第 n 级楼梯有多少种不同的爬楼梯…

    编程 2025-04-29
  • 如何使用Python获取某一行

    您可能经常会遇到需要处理文本文件数据的情况,在这种情况下,我们需要从文本文件中获取特定一行的数据并对其进行处理。Python提供了许多方法来读取和处理文本文件中的数据,而在本文中,…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 如何使用jumpserver调用远程桌面

    本文将介绍如何使用jumpserver实现远程桌面功能 一、安装jumpserver 首先我们需要安装并配置jumpserver。 $ wget -O /etc/yum.repos…

    编程 2025-04-29
  • Harris角点检测算法原理与实现

    本文将从多个方面对Harris角点检测算法进行详细的阐述,包括算法原理、实现步骤、代码实现等。 一、Harris角点检测算法原理 Harris角点检测算法是一种经典的计算机视觉算法…

    编程 2025-04-29
  • 数据结构与算法基础青岛大学PPT解析

    本文将从多个方面对数据结构与算法基础青岛大学PPT进行详细的阐述,包括数据类型、集合类型、排序算法、字符串匹配和动态规划等内容。通过对这些内容的解析,读者可以更好地了解数据结构与算…

    编程 2025-04-29
  • 如何使用Python读取CSV数据

    在数据分析、数据挖掘和机器学习等领域,CSV文件是一种非常常见的文件格式。Python作为一种广泛使用的编程语言,也提供了方便易用的CSV读取库。本文将介绍如何使用Python读取…

    编程 2025-04-29
  • Hibernate注解联合主键 如何使用

    解答:Hibernate的注解方式可以用来定义联合主键,使用@Embeddable和@EmbeddedId注解。 一、@Embeddable和@EmbeddedId注解 在Hibe…

    编程 2025-04-29
  • 瘦脸算法 Python 原理与实现

    本文将从多个方面详细阐述瘦脸算法 Python 实现的原理和方法,包括该算法的意义、流程、代码实现、优化等内容。 一、算法意义 随着科技的发展,瘦脸算法已经成为了人们修图中不可缺少…

    编程 2025-04-29

发表回复

登录后才能评论