博客
关于我
堆的操作与应用1 -C++
阅读量:799 次
发布时间:2019-03-25

本文共 2905 字,大约阅读时间需要 9 分钟。

堆的实现与应用

堆是一种非常有趣且重要的数据结构,它以其特殊的性质,使得许多高效算法成为可能。尤其在编程问题中,堆常常被用来解决排序问题,或者用来实现优先队列的功能。在本文中,我们将深入探讨堆的实现以及它在实际问题中的应用。


堆的初始化

堆的初始化可以通过调整的过程来完成。每当一个元素插入堆之后,需要确保该元素的位置是否满足堆的性质。如果不满足,进行调整直到满足为止。

void heap_adjust(int x) {    while (x * 2 <= tot) {        int j = x * 2;        if (j + 1 <= tot && heap[j + 1] > heap[j]) {            j++;        }        if (heap[j] > heapp[x]) {            swap(heap[x], heap[j]);            x = j;        } else {            break;        }    }}void Adjust(int tot) {    for (int i = tot / 2; i >= 1; i--) {        heap_adjust(i);    }}

合并果子(朴素版本)

在某些问题中,例如合并两个有序链表,我们可以用堆来实现。以下是一个朴素的合并示例,使用堆来合并两个有序序列:

#include 
#include
#include
using namespace std;void upload_Lb(int k) { while (k > 1) { if (h[k / 2] > h[k]) { swap(h[k / 2], h[k]); k /= 2; } else { return; } }}void down(int k) { while (2 * k <= tot) { int j = 2 * k; if (j < tot && h[j + 1] < h[j]) { j++; } if (h[j] < h[k]) { swap(h[j], h[k]); k = j; } else { return; } }}int main() { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { int x; scanf("%d", &x); h[i] = x; tot++; up(tot); } for (int i = 1; i < n; i++) { int tmp = h[1]; h[1] = h[tot--]; down(1); tmp += h[1]; h[1] = h[tot--]; down(1); ans += tmp; h[++tot] = tmp; up(tot); } printf("%d", ans); return 0;}

STL - priority_queue

在C++标准库中,priority_queue 提供了优先队列的实现,可以根据需求选择升序队列或降序队列。以下是 priority_queue 的基本用法示例:

#include 
using namespace std;// 升序队列priority_queue
, greater
> q;// 插入元素q.push(5);// 获取顶部元素q.top();// 删除顶部元素q.pop();// 获取队列大小q.size();

堆排序

堆排序是一种优化排序算法,利用了堆的性质来进行排序。其步骤如下:

  • 建立初始大顶堆:将数组调整为大顶堆。
  • 交换并调整:每次交换第一个元素和最后一个元素,重新调整堆结构。
  • 重复上述步骤,直到所有元素都被排序。
  • 以下是具体实现代码:

    #include 
    #include
    using namespace std;void max_heapify(int arr[], int start, int end) { int dad = start; int son = dad * 2 + 1; while (son <= end) { if (son + 1 <= end && arr[son] < arr[son + 1]) { son++; } if (arr[dad] > arr[son]) { return; } else { swap(arr[dad], arr[son]); dad = son; son = dad * 2 + 1; } }}void heap_sort(int arr[], int len) { for (int i = len / 2 - 1; i >= 0; i--) { max_heapify(arr, i, len - 1); } for (int i = len - 1; i > 0; i--) { swap(arr[0], arr[i]); max_heapify(arr, 0, i - 1); }}int main() { int arr[] = {3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6}; int len = sizeof(arr) / sizeof(*arr); heap_sort(arr, len); for (int i = 0; i < len; i++) { cout << arr[i] << ' '; } cout << endl; return 0;}

    转载地址:http://yfsyk.baihongyu.com/

    你可能感兴趣的文章
    NodeJs单元测试之 API性能测试
    查看>>
    nodejs图片转换字节保存
    查看>>
    nodejs在Liunx上的部署生产方式-PM2
    查看>>
    nodejs基于art-template模板引擎生成
    查看>>
    nodejs字符与字节之间的转换
    查看>>
    NodeJs学习笔记001--npm换源
    查看>>
    NodeJs学习笔记002--npm常用命令详解
    查看>>
    nodejs学习笔记一——nodejs安装
    查看>>
    vue3+Element-plus icon图标无法显示的问题(已解决)
    查看>>
    NodeJS实现跨域的方法( 4种 )
    查看>>
    nodejs封装http请求
    查看>>
    nodejs常用组件
    查看>>
    nodejs开发公众号报错 40164,白名单配置找不到,竟然是这个原因
    查看>>
    Nodejs异步回调的处理方法总结
    查看>>
    NodeJS报错 Fatal error: ENOSPC: System limit for number of file watchers reached, watch ‘...path...‘
    查看>>
    nodejs支持ssi实现include shtml页面
    查看>>
    Nodejs教程09:实现一个带接口请求的简单服务器
    查看>>
    nodejs服务端实现post请求
    查看>>
    nodejs框架,原理,组件,核心,跟npm和vue的关系
    查看>>
    Nodejs概览: 思维导图、核心技术、应用场景
    查看>>