数据结构 堆

Posted chenyangxu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 堆相关的知识,希望对你有一定的参考价值。

此随笔以最小堆为例,记录一些关于堆的知识点,例如建堆、插入、取min、堆排序...

用结构体把堆封装起来,面向对象?

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
//最小堆:建堆+插入+层序遍历+取min+堆排序(非降序)

const int MAX=1e5+5;
typedef struct heap
{
    int arr[MAX];
    int Size;
}heap;
void heapCreate(heap &h);
void nodeInsert(heap &h, int pos);
void levelTraverse(heap h);
int getMin(heap &h);
vector<int> heapSort(heap &h);
void output(vector<int> v);

int main()
{
    heap h;
    heapCreate(h);
    levelTraverse(h);
    output(heapSort(h));
    return 0;
}

void heapCreate(heap &h)
{
    memset(h.arr, -inf, sizeof(h.arr));
    cin>>h.Size;
    for(int i=1;i<=h.Size;++i) {
        cin>>h.arr[i];
        nodeInsert(h, i);
    }
}

void nodeInsert(heap &h, int pos)
{
    while(h.arr[pos/2]>h.arr[pos]){
        swap(h.arr[pos/2], h.arr[pos]);
        pos/=2;
    }
}

void levelTraverse(heap h)
{
    for(int i=1;i<=h.Size;++i)
        printf("%d%c",h.arr[i]," 
"[i==h.Size]);
}

int getMin(heap &h)
{
    int ans=h.arr[1];
    int n=h.Size;
    swap(h.arr[1], h.arr[n]);h.arr[n--]=inf;//inf作为哨兵
    h.Size=n;
    for(int pos=1; h.arr[pos]>min(h.arr[2*pos],h.arr[2*pos+1]); ){
        if(h.arr[2*pos]==min(h.arr[2*pos], h.arr[2*pos+1])) {
            swap(h.arr[pos], h.arr[2*pos]);
            pos=2*pos;
        }
        else if(h.arr[2*pos+1]==min(h.arr[2*pos], h.arr[2*pos+1])) {
            swap(h.arr[pos], h.arr[2*pos+1]);
            pos=2*pos+1;
        }
    }
    return ans;
}

vector<int> heapSort(heap &h)
{
    vector<int> ans;
    while(h.Size){
        int temp=getMin(h);
        ans.push_back(temp);
    }
    return ans;
}

void output(vector<int> v)
{
    int len=v.size();
    for(vector<int>::iterator it=v.begin();it!=v.end();++it)
        printf("%d%c",*it," 
"[it==v.end()-1]);
}
/*
5
46 23 26 24 10
*/

有时间一定要把传引用,面向对象这些知识点系统的学习一遍

以上是关于数据结构 堆的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 OnStop() 回收所有数据并使用保留片段?

算法排序之堆排序

是否可以在OnStop()上回收所有数据并使用保留片段?

Rail片段缓存如何使您的应用受益,即阻止数据库调用?

方法与对象内存分析

VSCode自定义代码片段5——HTML元素结构