选择排序——堆排序

目录

1、简述

2、复杂度

3、稳定性

4、例子


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;
}

 快捷跳转: 


生命不息,学习不止,若有不正确的地方,欢迎指正。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值