大顶堆,小顶堆--优先队列,示例

有一个数组,要求找出最大的3个数,最小的4个数。

 

小顶堆,从大到小排序,筛选最小的N个数。

    // 创建一个小顶堆
    std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap;

 

 

大顶堆,从小到大排序,筛选最大的N个数。

 // 创建一个大顶堆
    std::priority_queue<int, std::vector<int>, std::less<int>> max_heap;
    小顶堆:
         1
       /   \
      3     2
     / \   / \
    7   8 5   4

    大顶堆:
         8
       /   \
      7     5
     / \   / \
    3   1 2   4

 

小顶堆和大顶堆都是二叉堆的一种形式,是一种用于实现优先队列的数据结构。它们的区别在于元素的排列方式和根节点的值。

  1. 小顶堆(Min Heap):在小顶堆中,每个节点的值都小于或等于其子节点的值。换句话说,堆顶元素是最小值,根节点的值小于其左右子节点的值。小顶堆的性质使得堆顶元素是优先级最低的。

  2. 大顶堆(Max Heap):在大顶堆中,每个节点的值都大于或等于其子节点的值。换句话说,堆顶元素是最大值,根节点的值大于其左右子节点的值。大顶堆的性质使得堆顶元素是优先级最高的。

在小顶堆中,根节点的值最小,且每个节点的值都小于或等于其子节点的值。而在大顶堆中,根节点的值最大,且每个节点的值都大于或等于其子节点的值

 

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

// 定义一个函数来创建小顶堆并筛选出最小的 4 个数
std::vector<int> findFourSmallestNumbers(const std::vector<int>& nums) {
    // 创建一个小顶堆
    std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap;

    // 将数组中的元素插入到小顶堆中
    for (int i = 0; i< nums.size(); ++i) {
        min_heap.push(nums[i]);
    }

    // 从堆中依次取出最小的 4 个数
    std::vector<int> result;
    for (int i = 0; i < 4; ++i) {
        result.push_back(min_heap.top());
        min_heap.pop();
    }

    return result;
}

// 定义一个函数来创建大顶堆并筛选出最大的 3 个数
std::vector<int> findThreeLargestNumbers(const std::vector<int>& nums) {
    // 创建一个大顶堆
    std::priority_queue<int, std::vector<int>, std::less<int>> max_heap;

    // 将数组中的元素插入到大顶堆中
    for (int i = 0; i < nums.size(); ++i) {
        max_heap.push(nums[i]);
    }

    // 从堆中依次取出最大的 3 个数
    std::vector<int> result;
    for (int i = 0; i < 3; ++i) {
        result.push_back(max_heap.top());
        max_heap.pop();
    }

    return result;
}

int main() {
    std::vector<int> nums = {3, 1, 4, 10, 5, 19, 22, 60, 5, 38, 5, 8, 999, 7, 9, 31, 2};

    // 找到最小的 4 个数
    std::vector<int> fourSmallestNumbers = findFourSmallestNumbers(nums);
    std::cout << "最小的 4 个数: ";
    for (int num : fourSmallestNumbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 找到最大的 3 个数
    std::vector<int> threeLargestNumbers = findThreeLargestNumbers(nums);
    std::cout << "最大的 3 个数: ";
    for (int num : threeLargestNumbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

 

 

from chat-gpt:

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

using namespace std;

void findLargestAndSmallest(vector<int> &nums) {
    // Min heap
    priority_queue<int, vector<int>, greater<int>> minHeap;
    // Max heap
    priority_queue<int> maxHeap;

    // Push all elements to both heaps
    for (int num : nums) {
        minHeap.push(num);
        maxHeap.push(num);
    }

    // Find the largest 3 numbers
    cout << "Largest 3 numbers: ";
    for (int i = 0; i < 3; ++i) {
        cout << maxHeap.top() << " ";
        maxHeap.pop();
    }
    cout << endl;

    // Find the smallest 4 numbers
    cout << "Smallest 4 numbers: ";
    for (int i = 0; i < 4; ++i) {
        cout << minHeap.top() << " ";
        minHeap.pop();
    }
    cout << endl;
}

int main() {
    // Example array of 20 integers (random)
    vector<int> nums = {12, 34, 56, 78, 90, 23, 45, 67, 89, 10, 32, 54, 76, 98, 21, 43, 65, 87, 9, 87};

    findLargestAndSmallest(nums);

    return 0;
}

 

posted @ 2024-03-03 16:35  He_LiangLiang  阅读(12)  评论(0编辑  收藏  举报