排序算法-堆排序

參考:

  1. Java排序算法(五):堆排序
  2. 【算法與數(shù)據(jù)結(jié)構(gòu)】圖說堆排序
  3. 【數(shù)據(jù)結(jié)構(gòu)】排序算法:希爾、歸并、快速、堆排序

0. 完全二叉樹性質(zhì)

  1. 在完全二叉樹中,所有大于n/2的節(jié)點都是葉子節(jié)點;
  2. 如果2i+1<n,則左孩子節(jié)點序號為2i+1;否則i無左孩子;
    如果2i+2<n,則右孩子節(jié)點序號為2i+2;否則i無有孩子;

1. 算法說明

堆排序是對簡單排序的一種改進(jìn);

  • 簡單排序的缺點:
    簡單排序要從n條記錄中找出一個最小的記錄,需要比較n-1次。
    但是這樣的操作并沒有把每一趟的比較結(jié)果都保存下來,在后一趟比較過程中,有許多比較在前一趟中已經(jīng)做過了,但由于前一趟并未保存這些比較結(jié)果,所以后一趟排序又重復(fù)執(zhí)行了這些比較操作,因而比較次數(shù)較多。

  • 堆排序是一顆完全二叉樹

    • 大頂堆:每個節(jié)點都>=其左右孩子節(jié)點的值;
    • 小頂堆:每個節(jié)點都<=其左右孩子節(jié)點的值;
大頂堆和小頂堆

2. 算法思想

  • 步驟:
    將待排序的序列構(gòu)造成一個大頂堆。此時,整個序列的最大值,就是堆頂?shù)母?jié)點。將它移走(和堆數(shù)組的最后元素交換,此時末尾的元素就是最大值 ),將剩余的n-1個元素重新構(gòu)建成一個堆,就會得到n個元素中的次大值。如此反復(fù),就能得到一個有序序列。

  • 問題:

    1. 如何將一個無序序列構(gòu)建成一個堆?
    2. 如何在輸出堆頂元素之后,調(diào)整剩余的元素成為一個新堆?

3. java代碼實現(xiàn)

堆排序
建堆/調(diào)整堆過程
測試方法
結(jié)果

4.時間復(fù)雜度

  • O(nlogn)
  • 堆排序是不穩(wěn)定排序;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 排序的基本概念 在計算機(jī)程序開發(fā)過程中,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個關(guān)鍵字進(jìn)行排序,排序完成的序列可用于快...
    Jack921閱讀 1,571評論 1 4
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,303評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,829評論 0 15
  • 選擇排序 選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找...
    六尺帳篷閱讀 1,506評論 0 11
  • 總結(jié)一下常見的排序算法。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,519評論 0 1

友情鏈接更多精彩內(nèi)容