java堆排序

public class love {
 
    /*建队算法*/
    public static void  Filterheap(int heap[],int root,int upper){
        /*heap为待筛选的堆,root为堆的根结点,upper为无序区的上界*/
        int child; //指向孩子结点
        int item;   //作为过渡变量
        int r=root;    //r指向根结点
        child=2*root+1;  //初始时为根结点的左孩子
        while(child<upper){
            /*比较左右孩子的关键字值,并取大者*/
            if(child+1<upper && heap[child+1]>heap[child]){
                child=child+1;
            }
            /*若根结点不满足堆的条件,则与孩子交换*/
            if(heap[r]<heap[child]){
                item=heap[r];
                heap[r]=heap[child];
                heap[child]=item;
                r=child;
                child=2*child+1;                
            }else break;   //若根满足堆的条件,则不交换,并退出筛选
        }
 
    }
 
    public static void heapSort(int heap[],int n){
        /*heap为待排序序列,n为序列长度*/
        int i;
        int item;//过渡变量
        for(i=(n-2)/2;i>=0;i--){  //从第一个非页结点开始创建初始堆
            Filterheap(heap,i,n);
        }
 
        for(i=n-1;i>=0;i--){  //做n-1趟排序,每次堆的大小减1
            /*将堆顶元素与当前大根堆的最后一个元素交换*/
            item=heap[0];
            heap[0]=heap[i];
            heap[i]=item;
 
            /*筛选,将0~i的元素重新调整*/
            Filterheap(heap,0,i); 
 
            /*显示排序过程*/
            for(int j=0;j<n;j++){
                System.out.print(heap[j]+", ");
            }
            System.out.println();
        }
 
    }
 
    public static void main(String[] args) {
        /*使用堆排序法进行排序*/
        int heap[]=new int[]{9,8,7,6,5,4,3,2,1,10,11,12,13,14,15};  //把待排序的数存放在数组中
        int n=heap.length;
        
       heapSort(heap, n);
    }
 
}

猜你喜欢

转载自blog.csdn.net/wuyanan654/article/details/81779749