#include<iostream> #include<math.h> #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<string.h> const int MAX=50; using namespace std; int h[MAX]; int N=10;//长度 void sifup(int i) { if(i==1) { return; } while(i/2!=0) { if(h[i]<h[i/2])//小于父节点 //上浮 { swap(h[i],h[i/2]); } else //等于父节点 或是 大于父节点 不需要操作 { return; //break; } i/=2; } } void sifdown(int i)//向下调整 { if(i*2>=N)//大于长度 已到叶子结点 不用调整 { return; } if(h[i]<h[i/2])//小于父节点 向上调整 { sifup(i); return; } if(h[i]<h[i*2] && h[i]<h[i*2+1])//父节点小于左右结点 { return; //不用调整 } //+++++++++++++++++++++++++++++++此时父节点一定大于左右结点 int r,l,k;//左右两个结点的下标 l=i*2; r=i*2+1; k=h[l]>h[r]?r:l;//选出最小的结点的下标 //cout<<k<<endl; swap(h[k],h[i]); sifdown(k); } int main() { for(int i=1;i<=10;i++) { h[i]=rand()%20; sifup(i); } for(int i=1;i<=10;i++) { cout<<h[i]<<" "; }cout<<endl; h[1]=100; sifdown(1); for(int i=1;i<=N;i++) { cout<<h[i]<<" "; }cout<<endl; return 0; }
时间: 2024-10-18 02:29:04