堆是一棵完全二叉树
堆:大顶堆 小顶堆
具体代码解释
#include<bits/stdc++.h> using namespace std; int heap[100]; int n; //对heap数组在low high范围进行向下调整 void downAdjust(int low,int high) { //i为欲调整的结点 j为其左儿子 int i=low; int j=i*2; while(j<=high){//存在孩子结点 if(j+1<=high&&heap[j+1]>heap[j]){//右儿子存在并大于左儿子 j=j+1; } if(heap[j]>heap[i]){//孩子比父亲大就交换 swap(heap[j],heap[i]); //继续向下 看是否有不符合的 i=j; j=i*2; } else break; } } //创建一个大顶堆 void createHeap() { //对于完全二叉树来说 叶节点为n/2向下取整 例如:10->5 11->6 for(int i=n/2;i>=1;i--){ downAdjust(i,n); } } //删除堆顶元素 void deletetop() { heap[1]=heap[n--]; downAdjust(1,n); } //添加一个元素 void upAdjust(int low,int high) { int i=high; int j=i/2; while(j>=low){ if(heap[j]<heap[i]){ swap(heap[j],heap[i]); i=j; j=i/2; } else break; } } void insertt(int x) { heap[++n]=x; upAdjust(1,n); } //堆排序 最小堆 void heapsort() { createHeap(); for(int i=n;i>1;i--){ swap(heap[i],heap[1]);//没次都从i个数中取出堆顶(最大的数)与第i个数交换 downAdjust(1,i-1); } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&heap[i]); } createHeap(); for(int i=1;i<=n;i++) cout<<heap[i]<<endl; cout<<"**********************"<<endl; insertt(100); cout<<"n="<<n<<endl; for(int i=1;i<=n;i++) cout<<heap[i]<<endl; return 0; } /* 10 85 55 82 57 68 92 99 98 66 56 */