[JAVA]堆排序

VictorLeeLk發表於2017-09-23
package sort_book_datastruction;

import java.util.Arrays;
/**
 * 這是一個建立最大頂堆的過程,根節點值最大, 與最後一個元素進行交換之後,
 * 然後對剩下的元素進行篩選,即調整堆。
 * 兩步:1.建堆;2。帥選
 * @author Administrator
 *
 */
public class HeapSort {
    /**
     * 自堆頂至葉子的調整過程,即帥選;
     * @param array
     * @param s  待調整根節點的位置。
     * @param length
     */
    public void heapAdjust(int[] array,int s, int length){
        int temp = array[s];
        int child = 2*s+1;//左孩子節點位置;//左孩子結點的位置。(i+1 為當前調整結點的右孩子結點的位置)  

        while(child<length){
             // 如果右孩子大於左孩子(找到比當前待調整結點大的孩子結點)  
             if(child+1<length&&array[child]<array[child+1])
                 child++;//找到孩子節點比待調整節點大的位置上
             if(array[s]<array[child]){ // 如果較大的子結點大於父結點  
                 array[s] = array[child];// 那麼把較大的子結點往上移動,替換它的父結點  
                 s=child; // 重新設定s ,即待調整的下一個結點的位置  
                 child = 2*s+1;
             }else{// 如果當前待調整結點大於它的左右孩子,則不需要調整,直接退出  
                 break;
             }
             array[s] =temp;//把待調整的節點放到比其大的孩子節點上
        }
    }

    /**
     * 初始化建堆
     * 將array[a...length-1]建成堆
     * 這是一個反覆帥選的過程。
     * @param array
     * @param length
     */
    public void buildingHeap(int[] array,int length){
         //最後一個有孩子的節點的位置 i=  (length -1) / 2  
        for(int i =(length-1)/2;i>=0;i--){
            heapAdjust(array,i,length);
        }
    }
    public void heapSort(int[] array,int length){
        //初始堆
        buildingHeap(array,length);
        //從最後一個元素開始對序列進行調整  
        for(int i = length -1;i>0;--i){
            //交換堆頂元素H[0]和堆中最後一個元素  
            int temp = array[i];
            array[i] = array[0];
            array[0] =temp;
            //每次交換堆頂元素和堆中最後一個元素之後,都要對堆進行調整  
            heapAdjust(array,0,i);
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HeapSort hs =new HeapSort();
        int[] array = {49,38,65,97,76,13,27,49};
        hs.heapSort(array, array.length);
        System.out.println(" "+Arrays.toString(array));

    }

}

相關文章