1 //基于完全二叉树的极大堆的上下漂移实现 2 //INT_MAX极大数 INT_MIN极小数 3 #include <cstdlib> 4 #include <iostream> 5 #include <vector> 6 #define N 11 7 8 using namespace std; 9 10 typedef int T; //!!!!!!! 11 typedef vector<T>::iterator TP;//!!!!! 12 13 void shiftup(TP a,int n){ 14 for(int p=n/2;p>0&&(a[p]<a[n]);p=(n=p)/2)//向量可以这样索引 15 std::swap(a[p],a[n]); 16 } 17 18 19 void shiftdown(TP a,int n){ 20 for(int p=1,bc=2;bc<=n;bc=2*p){ 21 if(bc<n&&(a[bc]<a[bc+1])) ++bc; 22 if(a[p]<a[bc]) {std::swap(a[bc],a[p]);p=bc;} 23 else break; 24 } 25 } 26 27 28 29 30 int main(){ 31 vector<int> vv; 32 vv.reserve(2*N); 33 vv.push_back(INT_MAX); //INT_MAX极大数 INT_MIN极小数 34 //vv[0]=INT_MAX;//!!! 35 //cout<<vv[0]<<endl; 36 //system("PAUSE"); 37 // return 1; 38 //for(int i=1;i<21;i++) 39 vv.push_back(88); 40 vv.push_back(75); 41 vv.push_back(83); 42 vv.push_back(65); 43 vv.push_back(55); 44 vv.push_back(63); 45 vv.push_back(53); 46 vv.push_back(45); 47 vv.push_back(35); 48 //vv[2]=14;//用地址+【】进行索引 49 TP first=vv.begin(); 50 //!!!定义向量的指针用该语句,而非用取地址符号来定义 51 //cout<<vv[0]<<endl; 52 for(int i=0;i<N-1;i++) 53 cout<<vv[i]<<endl; 54 55 int o=91; 56 //极大堆的shiftup操作实现 57 cout<<"now add value to MAX_HEAP:"<<o<<endl; 58 vv.push_back(o); 59 shiftup(first,N-1); 60 cout<<"after shiftup operation:"<<endl; 61 for(int i=0;i<N;i++) 62 cout<<vv[i]<<endl; 63 64 std::swap(vv[N-1],vv[1]); 65 shiftdown(first,N-1); 66 cout<<"after shiftdown operation:"<<endl; 67 for(int i=0;i<N;i++) 68 cout<<vv[i]<<endl; 69 70 system("PAUSE"); 71 return 1; 72 } 73 74
时间: 2024-10-29 19:11:39