堆排序

堆排序是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法最盅。堆是一個近似完全二叉樹的結(jié)構(gòu)态辛,并同時滿足堆積的性質(zhì):即子結(jié)點的鍵值或索引總是小于(或者大于)它的父節(jié)點潜叛。

描述:

1絮爷、用數(shù)組創(chuàng)建一個最大堆(子結(jié)點的鍵值或索引總是小于它的父節(jié)點),如果二叉樹中父節(jié)點比子節(jié)點小欢峰,則交換位置葬荷,注意交換后下面的子樹規(guī)則可能被破壞,所以要循環(huán)至葉子節(jié)點。
2、此時數(shù)組中的第一個元素就是最大堆的根節(jié)點磨澡,也就是最大的元素。
2扒吁、將最大堆的根節(jié)點取出和最后一個元素交換,放在數(shù)組最后室囊,剩下的元素繼續(xù)創(chuàng)建最大堆雕崩,重復(fù)至排序完成。

動畫:

堆排序.gif

代碼:

    private void heapSort(int[] array) {
        //先創(chuàng)建最大堆
        int length = array.length;
        //length / 2 - 1是完全二叉樹最后一個非葉子節(jié)點
        //從最后一個非葉子節(jié)點開始整理融撞,直到根節(jié)點(下標0)
        for (int i = length / 2 - 1; i >= 0; i--) {
            maxHeapify(array, i, length - 1);
        }
        for (int i = length - 1; i > 0; i--) {
            //下標為0的元素為根節(jié)點且最大盼铁,取出放到最后
            int temp = array[0];
            array[0] = array[i];
            array[i] = temp;
            //剩下的繼續(xù)整理
            maxHeapify(array, 0, i - 1);
        }
    }

    /**
     * 整理最大堆
     * @param array 數(shù)組
     * @param start 起點下標
     * @param end 最后一個葉子節(jié)點下標
     */
    private void maxHeapify(int[] array, int start, int end) {
        int parent = start;
        //左孩子下標是父節(jié)點的2倍加1
        int child = parent * 2 + 1;
        while (child <= end) {
            //child + 1 表示右孩子
            //如果有右孩子 且 左孩子小于右孩子  則記錄大的那個(這里加=號是保證排序穩(wěn)定)
            if (child + 1 <= end && array[child] <= array[child + 1]) {
                child++;
            }
            if (array[parent] > array[child]) {
                return;
            } else {
                //交換父子節(jié)點
                int temp = array[parent];
                array[parent] = array[child];
                array[child] = temp;
                //繼續(xù)將子節(jié)點作為父節(jié)點整理
                parent = child;
                child = parent * 2 + 1;
            }
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市尝偎,隨后出現(xiàn)的幾起案子饶火,更是在濱河造成了極大的恐慌,老刑警劉巖冬念,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趁窃,死亡現(xiàn)場離奇詭異牧挣,居然都是意外死亡急前,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門瀑构,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裆针,“玉大人,你說我怎么就攤上這事寺晌∈蓝郑” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵呻征,是天一觀的道長耘婚。 經(jīng)常有香客問我,道長陆赋,這世上最難降的妖魔是什么沐祷? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任嚷闭,我火速辦了婚禮,結(jié)果婚禮上赖临,老公的妹妹穿的比我還像新娘胞锰。我一直安慰自己,他們只是感情好兢榨,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布嗅榕。 她就那樣靜靜地躺著,像睡著了一般吵聪。 火紅的嫁衣襯著肌膚如雪凌那。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天吟逝,我揣著相機與錄音案怯,去河邊找鬼。 笑死澎办,一個胖子當著我的面吹牛嘲碱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播局蚀,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼麦锯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琅绅?” 一聲冷哼從身側(cè)響起扶欣,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎千扶,沒想到半個月后料祠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡澎羞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年髓绽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妆绞。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡顺呕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出括饶,到底是詐尸還是另有隱情株茶,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布图焰,位于F島的核電站启盛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜僵闯,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一笤闯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棍厂,春花似錦颗味、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至张漂,卻和暖如春晶默,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背航攒。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工磺陡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漠畜。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓币他,卻偏偏與公主長得像,于是被迫代替她去往敵國和親憔狞。 傳聞我的和親對象是個殘疾皇子蝴悉,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345