码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构 堆

时间:2019-04-21 14:26:50      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:amp   关于   结构   pcr   std   sort   color   swa   遍历   

此随笔以最小堆为例,记录一些关于堆的知识点,例如建堆、插入、取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]," \n"[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," \n"[it==v.end()-1]);
}
/*
5
46 23 26 24 10
*/

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

数据结构 堆

标签:amp   关于   结构   pcr   std   sort   color   swa   遍历   

原文地址:https://www.cnblogs.com/ChenyangXu/p/10744961.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!