堆的性质,是永远最大的在上面(最大堆,最小堆反之)
//====================堆排序==============================
//堆取左右节点和父节点的操作
int myleft(int i){
return 2*i+1;
}
int myright(int i){
return 2*i+2;
}
int myparent(int i){
return (i-1)/2;
}
//打印堆,本层打印完毕,则下一层已经全部入队列
void printheap(int *A,int heapsize){
queue<int> q;
q.push(0);
int i=0;
int curnum=1;
int nextnum=0;
int l,r;
while(!q.empty()){
i=q.front();
q.pop();
curnum--;
cout<<A[i]<<" ";
l=myleft(i);
r=myright(i);
if(l<heapsize){
q.push(l);
nextnum++;
}
if(r<heapsize){
q.push(r);
nextnum++;
}
if(curnum==0){
curnum=nextnum;
nextnum=0;
cout<<endl;
}
}
}
//维护最大堆的性质,保证堆顶的数一定大于下面的数,前提是子堆已经是最大堆了
void myMaxHeap(int *A,int i,int heapsize){
int l=myleft(i);
int r=myright(i);
int largest=i;
if(l<heapsize&&A[l]>A[largest]){
largest=l;
}
if(r<heapsize&&A[r]>A[largest]){
largest=r;
}
if(largest!=i){
swap(A[i],A[largest]);
myMaxHeap(A,largest,heapsize);
}
}
//建堆
void mybuildheap(int * A,int len){
for(int i=len-1;i>=0;i--){//自下而上
myMaxHeap(A,i,len);
}
}
//排序
void myheapsort(int * A,int bg,int ed){
int len=ed-bg;
mybuildheap(A+bg,len);
for(int i=ed-1;i>=bg;i--){
swap(A[i],A[bg]);
len--;
myMaxHeap(A+bg,0,len);
}
}
//======================================================