java堆排序實現

來源:互聯網
上載者:User

標籤:style   index -1   重複   heap   str   stat   --   string   效率   

代碼如下:

public class HeapSort {    public static void heapSort(DataWrap[] data)    {        System.out.println("開始排序");        int length = data.length;        //迴圈建堆        for(int i = 0;i < length-1; i++)        {            //建堆            buiilMaxdHeap(data , length-1-i);            //交換堆訂和最後一個元素            swap(data , 0, length-1-i);            System.out.println(java.util.Arrays.toString(data));        }    }    //交換data數組中i和j兩處索引的元素    private static void swap(DataWrap[] data, int i, int j) {        DataWrap tmp = data[i];        data[i] = data[j];        data[j] = tmp;            }    //對data數組從0到lastindex建最大堆    private static void buiilMaxdHeap(DataWrap[] data, int lastindex) {        //從lastindex處節點(最後一個節點)的父節點開始        for(int i = (lastindex -1)/2;i >= 0;i--)        {            //k儲存當前正在判斷的節點            int k = i;            //如果當前k節點的子節點存在            while(k * 2+1 <= lastindex)            {                //k節點的左子節點的索引                int biggerIndex = 2*k+1;                //如果biggerIndex小於lastindex,即biggerindex+1                if(biggerIndex < lastindex)                {                    //如果右子節點的值較大                    if(data[biggerIndex].compareTo(data[biggerIndex+1]) < 0)                    {                        //biggerIndex總是記錄較大子節點的索引                        biggerIndex++;                    }                }                //如果k節點的值小於較大位元組點的值                if(data[k].compareTo(data[biggerIndex]) < 0)                {                    //交換它們                    swap(data, k, biggerIndex);                    //將biggerIndex賦給k,開始while迴圈的下一次的迴圈                    k = biggerIndex;                }                else                {                    break;                }            }        }    }    public static void main(String[] args) {        DataWrap [] data = {                new DataWrap(21, ""),                new DataWrap(30, ""),                new DataWrap(49, ""),                new DataWrap(30, ""),                new DataWrap(21, ""),                new DataWrap(16, ""),                new DataWrap(9, "")        };        System.out.println("排序之前:\n" + java.util.Arrays.toString(data));        heapSort(data);        System.out.println("排序之後:\n" + java.util.Arrays.toString(data));    }}

說明:

       上面堆排序的關鍵在於buildMaxHeap()方法。該方法用於對data數組從0到lastindex索引範圍內的元素建大頂堆,這樣就選擇出數組索引從0到lastindex範圍內的最大元素。採用迴圈不斷重複上面過程即可完成堆排序。

       對於堆排序演算法而言,假設有n項資料,需要進行n-1次建堆,每次建堆本身耗時為log2n,則其時間效率為O(nlog2n)。堆排序的空間效率很高,它只需要一個附加的程式單元用於交換,其空間效率為O(1)。

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.