【排序知多少】堆排序詳解

堆排序的概述

堆是具有下列特性的完全二叉樹:每個(gè)節(jié)點(diǎn)的值都大于或等于其左右孩子的節(jié)點(diǎn)的值溃卡,成為大頂堆竞漾,或者每個(gè)節(jié)點(diǎn)的值都小于或等于其左右孩子節(jié)點(diǎn)的值侮繁,成為小頂堆结窘。

在選擇到最小記錄同時(shí)怖喻,并根據(jù)比較結(jié)果對(duì)其他記錄做出相應(yīng)調(diào)整底哗。這樣的排序整體效率非常高。

堆排序的思路

堆排序(Heap Sort)就是利用堆進(jìn)行排序的方法锚沸。他的基本思想是跋选,將待排序的序列構(gòu)造成一個(gè)大頂堆,此時(shí)哗蜈,整個(gè)序列的最大值就是對(duì)定的根節(jié)點(diǎn)前标。將他移走(其實(shí)就是將其余對(duì)數(shù)組的末尾元素交換,此時(shí)末尾元素就是最大值)距潘,然后將剩余的n-1個(gè)序列重新構(gòu)成一個(gè)堆炼列,這樣就會(huì)得到n個(gè)元素中的次小值。如此反復(fù)音比,便能得到一個(gè)有序序列俭尖。

堆排序的復(fù)雜度

他的運(yùn)行時(shí)間主要是消耗在初始結(jié)構(gòu)建堆和在重建堆時(shí)的反復(fù)篩選上。

在構(gòu)建堆的過程中洞翩,因?yàn)槲覀兪峭耆鏄鋸淖钕聦幼钣疫叺姆墙K端節(jié)點(diǎn)開始構(gòu)建稽犁,將它與其他孩子進(jìn)行比較和有必要的交換,對(duì)于每個(gè)非終端節(jié)點(diǎn)來說骚亿,其實(shí)最多進(jìn)行兩次比較和互換已亥,因此整個(gè)構(gòu)建堆的時(shí)間復(fù)雜度為O(n)。

在正式排序時(shí)来屠,第i次取堆頂記錄重建堆需要用O(logi)的時(shí)間虑椎,并且需要取n-1次堆頂記錄。因此俱笛,重建堆的時(shí)間復(fù)雜度為O(nlogn)捆姜。

空間復(fù)雜度上,它只有一個(gè)用來交換的暫存單元嫂粟,也非常不錯(cuò)娇未,不過由于記錄的比較與交換是跳躍式進(jìn)行,因此堆排序也是一種不穩(wěn)定的排序方法星虹。

堆排序的JAVA實(shí)現(xiàn)

public class Main {
    public static void main(String[] args) {
        int[] arr = new int[10];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Math.toIntExact(Math.round(Math.random() * 1000));
        }
        HeapSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    private static void HeapSort(int[] arr) {
        int i;
        for (i = arr.length / 2 - 1; i >= 0; i--) {
            HeapAdjust(arr, i, arr.length);
        }
        for (i = arr.length - 1; i >= 1; i--) {
            swap(arr, 0, i);
            HeapAdjust(arr, 0, i);
        }
    }

    private static void HeapAdjust(int[] arr, int s, int m) {
        int temp;
        temp = arr[s];
        int index = 2 * s + 1;
        while (index < m) {
            if (index + 1 < m) {
                if (arr[index] < arr[index + 1]) {
                    index++;
                }
            }
            if (arr[index] > temp) {
                arr[s] = arr[index];
                s = index;
                index = 2 * s + 1;
            } else {
                break;
            }
        }
        arr[s] = temp;
    }

    private static void swap(int[] arr, int s, int e) {
        int temp = arr[s];
        arr[s] = arr[e];
        arr[e] = temp;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末零抬,一起剝皮案震驚了整個(gè)濱河市镊讼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌平夜,老刑警劉巖蝶棋,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異忽妒,居然都是意外死亡玩裙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門段直,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吃溅,“玉大人,你說我怎么就攤上這事鸯檬【龀蓿” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵喧务,是天一觀的道長(zhǎng)赖歌。 經(jīng)常有香客問我,道長(zhǎng)功茴,這世上最難降的妖魔是什么庐冯? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮坎穿,結(jié)果婚禮上展父,老公的妹妹穿的比我還像新娘。我一直安慰自己赁酝,他們只是感情好犯祠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布旭等。 她就那樣靜靜地躺著酌呆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搔耕。 梳的紋絲不亂的頭發(fā)上隙袁,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音弃榨,去河邊找鬼菩收。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鲸睛,可吹牛的內(nèi)容都是我干的娜饵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼官辈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼箱舞!你這毒婦竟也來了遍坟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤晴股,失蹤者是張志新(化名)和其女友劉穎愿伴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體电湘,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隔节,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寂呛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怎诫。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贷痪,靈堂內(nèi)的尸體忽然破棺而出刽虹,到底是詐尸還是另有隱情,我是刑警寧澤呢诬,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布涌哲,位于F島的核電站,受9級(jí)特大地震影響尚镰,放射性物質(zhì)發(fā)生泄漏阀圾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一狗唉、第九天 我趴在偏房一處隱蔽的房頂上張望初烘。 院中可真熱鬧,春花似錦分俯、人聲如沸肾筐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吗铐。三九已至,卻和暖如春杏节,著一層夾襖步出監(jiān)牢的瞬間唬渗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工奋渔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镊逝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓嫉鲸,卻偏偏與公主長(zhǎng)得像撑蒜,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容