#include<iostream> #include<limits> using namespace std; void Swap(int &a,int &b) { int tmp; tmp=a; a=b; b=tmp; } //类最大堆 class Max_Heap { private: int *A; int heap_size;//堆中元素的个数 int length;//数组中元素的个数 public: Max_Heap(int n) { A=new int[n]; length=n; heap_size=0; } //Parent Left Right在类内实现,为内联函数 int Parent(int i){return (i-1)/2;} int Left(int i){return i*2+1;} int Right(int i){return (i+1)*2;} void Max_Heapify(int i);//保持最大堆的性质 void Build_Max_Heap();//在建立最大堆 void HeapSort();//堆排序 int Heap_Median();//返回堆中中间元素 void Max_Heap_Insert(int x);//将元素x插入到堆中 int Heap_MaxMum();//返回堆中最大的元素 int Heap_Extract_Max();//去掉并返回堆中最大的 void Heap_Increase_Key(int x,int k);//将元素x的的关键字增加到k ~Max_Heap() { delete []A; } }; void Max_Heap::Max_Heapify(int i) { int l=Left(i); int r=Right(i); int largest;//记录left right i中最大者 if(l<=heap_size-1 && A[l]>A[i]) largest=l; else largest=i; if(r<=heap_size-1 && A[r]>A[largest]) largest=r; if(largest!=i) { Swap(A[i],A[largest]); Max_Heapify(largest); } } void Max_Heap::Build_Max_Heap() { heap_size=length; for(int i=length/2-1;i>=0;i--) Max_Heapify(i); } void Max_Heap::HeapSort() { //首先建立最大堆 Build_Max_Heap(); //A[0]中存放最大的元素,将A[0]与A[i]交换(i从n-1...1),然后将A[0...i-1]建成最大堆 for(int i=length-1;i>=1;i--) { Swap(A[0],A[i]); heap_size--; Max_Heapify(0); } } int Max_Heap::Heap_Median() { return A[length/2]; } //在堆末尾插入一个具有最小关键值的元素,将该元素的关键字增加到x void Max_Heap::Max_Heap_Insert(int x) { if(heap_size==length) { cout<<"the heap is full."<<endl; return; } heap_size++; A[heap_size-1]=INT_MIN; Heap_Increase_Key(heap_size-1,x); } //返回堆中最大元素 int Max_Heap::Heap_MaxMum() { if(heap_size==0) { cout<<"the heap is empty."<<endl; return -1; } return A[0]; } //去掉并返回堆中具有最大关键字的元素 int Max_Heap::Heap_Extract_Max() { if(heap_size==0) { cout<<"the heap is empty."<<endl; return -1; } int max; max=A[0]; heap_size--; A[0]=A[heap_size]; Max_Heapify(0); return max; } //将元素x的的关键字增加到k void Max_Heap::Heap_Increase_Key(int x,int k) { if(k<A[x]) { cout<<"error.new key is smaller than current key."<<endl; return; } A[x]=k; while(x>=1 && A[Parent(x)]<A[x]) { Swap(A[Parent(x)],A[x]); x=Parent(x); } } int main() { int n,i,x; cin>>n; Max_Heap MaxHeap(n); for(i=0;i<n;i++) { cin>>x; MaxHeap.Max_Heap_Insert(x); } MaxHeap.HeapSort(); cout<<MaxHeap.Heap_Median()<<endl; return 0; }