标签: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