QT下一个简单的堆排序代码

#include <iostream>
#include <vector>

using namespace std;

// 调整堆,使其满足堆性质,即父节点的值大于等于子节点的值
void heapify(vector<int>& array, int n, int i) {
    int largest = i; // 初始化最大值为父节点
    int left = 2 * i + 1; // 左子节点
    int right = 2 * i + 2; // 右子节点
    
    if (left < n && array[left] > array[largest]) {
        largest = left;
    }
    
    if (right < n && array[right] > array[largest]) {
        largest = right;
    }
    
    if (largest != i) { // 如果最大值不等于父节点,则交换位置,并递归调整子树
        swap(array[i], array[largest]);
        heapify(array, n, largest);
    }
}

void heapSort(vector<int>& array) {
    int n = array.size();
    
    // 建立初始堆,从第一个非叶子节点开始调整堆
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(array, n, i);
    }
    
    // 逐个从堆顶取出元素,放到数组末尾,并重新构建堆
    for (int i = n - 1; i >= 0; i--) {
        swap(array[0], array[i]);
        heapify(array, i, 0);
    }
}

int main() {
    vector<int> array = {9, 5, 2, 7, 1, 6, 3};
    
    heapSort(array);
    
    for (int i = 0; i < array.size(); i++) {
        cout << array[i] << " ";
    }
    
    return 0;
}

        这是一个使用C++编写的高效的堆排序算法。堆排序利用了二叉堆的性质,通过构建最大堆(或最小堆),将最大(最小)元素置于数组的末尾,然后缩小堆的范围,并重复此过程,直到整个数组有序。

        在heapify函数中,通过比较父节点与其左右子节点的值,找出其中最大的一个,并进行交换,然后递归调整子树。在heapSort函数中,首先建立初始堆,然后逐个取出堆顶元素,并重新构建堆,直到所有元素有序。

        在主函数中,我们示例了一个包含一些无序元素的数组,并对其进行堆排序,并输出排序后的结果。

        该算法的时间复杂度为O(nlogn),空间复杂度为O(1),其中n为输入数组的大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农709

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值