堆排序JAVA實現

來源:互聯網
上載者:User

標籤:

package kpp.sort;/** * 堆的定義如下:  n個元素的序列{k0,k1,...,ki,…,k(n-1)}若且唯若滿足下關係時,稱之為堆。  " ki<=k2i,ki<=k2i+1;或ki>=k2i,ki>=k2i+1.(i=1,2,…,[n/2])"  若將和此次序列對應的一維數組(即以一維數組作此序列的儲存結構)看成是一個完全二叉樹,  則完全二叉樹中每一個節點的值的都大於或等於任意一個位元組的值(如果有的話),稱之為大頂堆。  則完全二叉樹中每一個節點的值的都小於或等於任意一個位元組的值(如果有的話),稱之為小頂堆。  由此,若序列{k0,k1,…,k(n-1)}是堆,則堆頂元素(或完全二叉樹的根)必為序列中n個元素的最小值(或最大值)。  倘若給堆中每一個節點都賦予一個整數值標籤,根節點被標記為0,對於每一個標記為i的節點,其左子節點(若存在的話)被標記為2*i+1,其右 子節點(若存在的話)被標記為2*i+2,對於一個標記為i的非根節點,其父節點被標記為(i-1)/2。使用這個標記,我們能夠將堆儲存在數組中,節點 儲存在資料中的位置就使其標籤。 * @author kpp * */public class HeapSort {    public static void main(String[] args) {        // TODO Auto-generated method stub        int array[] = {49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};        heapSort(array);        for(int k :array){            System.out.println(k);        }    }    /**     * 堆排序     * @param array     */    public static void heapSort(int[] array){        //構建初始堆        buildHeap(array);        int n = array.length;        for(int i=n-1;i>=1;i--){            //交換堆頂元素和最後一個未排序元素            swap(array,0,i);            //重新調整剩下的堆            adjustHeap(array,0,i);            }    }        /**     * 建堆     * @param array     */    public static void buildHeap(int[] array){        int n = array.length;//數組中元素的個數        for(int i=n/2-1;i>=0;i--)            adjustHeap(array,i,n);                }    /**     * 調整堆     * @param A     * @param current 當前元素     * @param end 當前需要調整的堆的最後一個葉子節點下標     */    public static void adjustHeap(int[] A,int current,int end){        int left = 2*current+1;// 左孩子的下標(如果存在的話)        int right =2*current+2;// 左孩子的下標(如果存在的話)        int largest = 0;//尋找3個節點中最大值節點的下標        if(left<end && A[left]>A[current])            largest = left;        else            largest = current;        if(right<end && A[right]>A[largest])            largest = right;        if(largest!=current){            swap(A,largest,current);            adjustHeap(A,largest,end);                        }        }    /**     * 堆頂元素和最後一個未排序元素交換     * @param array     * @param i     * @param j     */    public static void swap(int[] array,int i,int j){        int temp =0;        temp=array[i];        array[i]=array[j];        array[j]=temp;    }}

 

堆排序JAVA實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.