一问教你熟练掌握大根堆和从小到大的排序VS小根堆和从大到小的排序

1. 大根堆(Max-Heap)

大根堆是一种完全二叉树,满足每个节点的值都不小于其子节点的值,因此,堆顶元素是整个堆的最大值。大根堆常用于实现优先队列,当需要频繁地取最大值时非常有用。

C++ 中的 priority_queue 实现大根堆:

在 C++ 中,priority_queue 默认就是大根堆,因此可以直接使用。

#include <iostream>
#include <queue>
#include <vector>

int main() {
    std::priority_queue<int> maxHeap;

    // 插入元素
    maxHeap.push(10);
    maxHeap.push(5);
    maxHeap.push(20);
    maxHeap.push(1);

    // 输出大根堆元素
    while (!maxHeap.empty()) {
        std::cout << maxHeap.top() << " ";  // 打印堆顶元素
        maxHeap.pop();  // 删除堆顶元素
    }

    return 0;
}

输出:

20 10 5 1

2. 从小到大的排序(Ascending Order)

从小到大的排序是将一组元素按照非递减的顺序排列。大多数排序算法默认就是从小到大排序,比如 std::sort

C++ 中的 std::sort 实现从小到大排序:
#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> vec = {10, 5, 20, 1};

    // 从小到大排序
    std::sort(vec.begin(), vec.end());

    // 输出排序后的元素
    for (int num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

输出:

1 5 10 20

3. 小根堆(Min-Heap)

小根堆是一种完全二叉树,满足每个节点的值都不大于其子节点的值,因此,堆顶元素是整个堆的最小值。小根堆常用于需要频繁取最小值的场景。

C++ 中的 priority_queue 实现小根堆:

通过传入比较器 std::greater<int>,可以将 priority_queue 转换为小根堆。

#include <iostream>
#include <queue>
#include <vector>

int main() {
    // 使用 greater<int> 比较器来创建小根堆
    std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;

    // 插入元素
    minHeap.push(10);
    minHeap.push(5);
    minHeap.push(20);
    minHeap.push(1);

    // 输出小根堆元素
    while (!minHeap.empty()) {
        std::cout << minHeap.top() << " ";  // 打印堆顶元素
        minHeap.pop();  // 删除堆顶元素
    }

    return 0;
}

输出:

1 5 10 20

4. 从大到小的排序(Descending Order)

从大到小的排序是将一组元素按照非递增的顺序排列。这可以通过 std::sort 配合 std::greater<int> 比较器来实现。

C++ 中的 std::sort 实现从大到小排序:
#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> vec = {10, 5, 20, 1};

    // 从大到小排序
    std::sort(vec.begin(), vec.end(), std::greater<int>());

    // 输出排序后的元素
    for (int num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

输出:

20 10 5 1

总结

  • 大根堆(Max-Heap):堆顶是最大元素。用于频繁取最大值的场景,如优先队列。
  • 从小到大的排序(Ascending Order):将元素按从小到大的顺序排列,常见排序算法默认都是这个顺序。
  • 小根堆(Min-Heap):堆顶是最小元素。用于频繁取最小值的场景,如优先队列。
  • 从大到小的排序(Descending Order):将元素按从大到小的顺序排列,可以通过改变排序算法的比较器来实现。
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是用C语言实现堆排序算法对用户输入的任意一串数字从小到大排序的代码: ```c #include <stdio.h> // 堆排序 void heapSort(int arr[], int n) { // 构建大根堆 for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } // 从最后一个节点开始排序 for (int i = n - 1; i >= 0; i--) { // 将当前节点与根节点交换 int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // 重新构建大根堆 heapify(arr, i, 0); } } // 构建大根堆 void heapify(int arr[], int n, int i) { int largest = i; // 初始化父节点为最大值 int l = 2 * i + 1; // 左节点 int r = 2 * i + 2; // 右节点 // 如果左节点比父节点大,则更新最大值为左节点 if (l < n && arr[l] > arr[largest]) { largest = l; } // 如果右节点比父节点大,则更新最大值为右节点 if (r < n && arr[r] > arr[largest]) { largest = r; } // 如果最大值不是父节点,则交换父节点与最大值 if (largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; // 递归调用,构建大根堆 heapify(arr, n, largest); } } int main() { int n; printf("请输入要排序的数字个数:"); scanf("%d", &n); int arr[n]; printf("请输入%d个数字:\n", n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } heapSort(arr, n); printf("排序后的结果为:\n"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` 代码实现的思路是先构建一个大根堆,然后从最后一个节点开始排序,每次将当前节点与根节点交换,并重新构建大根堆,直到所有节点都被排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Frank---7

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

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

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

打赏作者

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

抵扣说明:

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

余额充值