堆排序

 对于堆,其是一个完全二叉树的结构。如果是数组存储的话(索引值重0开始),其父节点的索引值为(i-1)/2,左孩子结点的索引为2*i+1,右孩子结点索引为2*i+2。

对堆的调整

    public static void heapAdjust(int[] A,int i,int size){
        int leftChild=i*2+1;
        int rightChild=i*2+2;
        int max=i;
        if(i<size){
            if(leftChild<size&&A[leftChild]>A[max]){
                max=leftChild;
            }
            if(rightChild<size&&A[rightChild]>A[max]){
                max=rightChild;
            
            }
            if(max!=i){   //交换之后,逐级调整
                int temp=A[i];
                A[i]=A[max];
                A[max]=temp;
                heapAdjust(A, max, size);
            }
            
        }  
    }

建堆

    public static void buildHeap(int[] A,int size){
        for(int i=size/2;i>=0;--i){
            heapAdjust(A, i, size);
        }
    }

 

 堆排

    public static void heapSort(int[]A,int size){
        buildHeap(A, size);
        for(int i=size-1;i>=0;--i){
            int temp=A[i];
            A[i]=A[0];
            A[0]=temp;
            System.out.println(A[i]);
            heapAdjust(A, 0, i);
        }
    }

 

posted @ 2017-03-09 21:13  mslog  阅读(145)  评论(0编辑  收藏  举报