堆排序(用了好多的位运算)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10000;
int a[maxn];
int main(){
    int i,j,k,m=0,n,t;
    scanf("%d",&n);
    int top=1;//模拟堆顶
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);//显然这不用多解释,输入;
        int len=i;
        while(len>1&&a[len]<a[len/2]){//每次输入一个数便将最小数放在堆顶 ;
            swap(a[len],a[len/2]);//如果他的儿子大于它的父亲,便将其交换;
            len/=2;
        }
    }
    m=n;
    for(i=1;i<=n;i++){//将其变为小根堆树;
        printf("%d ",a[1]);
        a[1]=a[m];m--;//将叶子节点放置堆顶往下沉,这是堆排的特性,因为堆的叶子节点是根节点;
        top=1;
        while((a[top]>a[top<<1]&&(top<<1)<=m)||(a[top]>a[top<<1|1]&&((top<<1|1)<=m))){//每次将其交换
            t=(top<<1);
            if(a[t]>a[t+1] &&  t+1<=m)t++;//如果左儿子大于右儿子便将其变成右儿子,便于之后的交换,将最小的永远放置堆顶 ;
            swap(a[top],a[t]);
            top=t;
        }
        qsort("","","""");
        //for(j=1;j<=m;j++)printf("%d ",a[j]);  
        //puts("");//调试程序;
    }
    return 0;
}

posted @ 2016-08-26 21:01  Drinkwater_cnyali  阅读(143)  评论(0编辑  收藏  举报