堆排序

public classMain {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        int test[] ={0,-1,78,22,45,-100};

        HeapSort(test);

        for(int i = 0;i<test.length;i++){

          

           System.out.println(test[i]);

        }

    }

   

    public static void HeapSort(int values[]){

       

        for( int i = values.length/2 -1;i>=0;i--){

           MinHeapFiexDown(values,i,values.length);

        }

        for( int i = values.length -1 ;i >=1 ;i--){

           Swap(values,i,0);

           MinHeapFiexDown(values,0,i);

        }

    }

    // i節點開始調整,n爲節點總數,0開始計算i節點的子節點爲:2*i+1,2*i+2

    @SuppressWarnings("unused")

    private static void MinHeapFiexDown(int a[],int i,int n){

       

        int j,temp;

        temp = a[i];

        j = 2*i+1;

        while(j < n){

          

           // 在左右孩子中獲取最小的

           if(j + 1 < n  && a[j + 1] < a[j]) j++;

           if(a[j] >= temp) break;

          

           a[i] = a[j];

           i = j;

           j = 2 * i + 1;

        }

        a[i] = temp;

    }

    @SuppressWarnings("unused")

    private static void Swap(int values[],int aIdx,int bIdx){

       

        int temp = values[aIdx];

        values[aIdx] = values[bIdx];

        values[bIdx]  = temp;

    }

}

//輸出結果:

78

45

22

0

-1

-100

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章