堆排序

来源:互联网 发布:作图软件app 编辑:程序博客网 时间:2024/06/05 05:04

堆的性质,是永远最大的在上面(最大堆,最小堆反之)

//====================堆排序==============================//堆取左右节点和父节点的操作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);    }}//======================================================
0 0
原创粉丝点击