C語言:十種排序(七) - 堆排序

前言

一種將無序數(shù)組進行排序的方法。

堆排序,wiki參考:
https://zh.wikipedia.org/wiki/%E5%A0%86%E6%8E%92%E5%BA%8F

堆排序,主要思想:將一維數(shù)組構(gòu)造成堆結(jié)構(gòu)咸产,再對堆結(jié)構(gòu)進行排序。

環(huán)境

編輯器:vs2019
文件:.c類型

正文

代碼參考:

#include <stdio.h>


// 父節(jié)點i的左子節(jié)點在位置 2i + 1 ;
// 父節(jié)點i的右子節(jié)點在位置 2i + 2 ;

// 堆排序, 類似于滿二叉樹琼掠。
// 1. 構(gòu)建大頂堆結(jié)構(gòu)
// 2. 通過大頂堆結(jié)構(gòu)排序


void swap(int* a, int* b) {
    int temp = *b;
    *b = *a;
    *a = temp;
}


// 構(gòu)建大頂堆, 從小到大排序停撞,父節(jié)點大于子節(jié)點瓷蛙。
void _max_heap_sort(int source_array[], int start, int end)
{
    // 父節(jié)點
    int dad = start;

    // 子節(jié)點中最大的節(jié)點,默認為左子節(jié)點戈毒。
    int son = dad * 2 + 1;

    while (son <= end)
    {
        // 找出子節(jié)點中最大的
        if (son + 1 <= end && source_array[son + 1] > source_array[son])
        {
            // 如果右子節(jié)點大于左子節(jié)點艰猬,則son 指向右子節(jié)點
            son++;
        }

        // 已經(jīng)找到最大的子節(jié)點,開始調(diào)整父節(jié)點與子節(jié)點滿足大頂堆埋市。
        if (source_array[son] > source_array[dad])
        {
            swap(&source_array[son], &source_array[dad]);
        }
        dad = son;
        son = dad * 2 + 1;
    }

}


void max_heap_sort_normal(int source_array[], int source_array_length)
{
    int i;
    // 1. 構(gòu)造大頂堆結(jié)構(gòu)
    // 遍歷每一個父節(jié)點冠桃。大頂堆要求父節(jié)點大于子節(jié)點,因此采用逆序的方式道宅。
    for (i = source_array_length / 2 - 1; i >= 0; i--)
    {
        _max_heap_sort(source_array, i, source_array_length - 1);
    }

    // 2. 通過大頂堆結(jié)構(gòu)進行排序食听。
    // 每次都讓列表的第一個值最大,然后將最大值移到最后污茵,有點選擇排序的意味樱报。
    for (i = source_array_length - 1; i > 0; i--)
    {
        // 將最大值移到末尾
        swap(&source_array[0], &source_array[i]);
        // 將打亂的大頂堆,重新構(gòu)造省咨。
        _max_heap_sort(source_array, 0, i - 1);
    }
}


int main()
{
    // 生成隨機測試列表
    int test_list[20];
    int test_list_length = sizeof(test_list) / sizeof(int);
    printf("測試列表: \n");
    for (int i = 0; i < test_list_length; i++)
    {
        test_list[i] = rand() % 100;
        printf("%d ", test_list[i]);
    }
    printf("\n");

    // 普通堆排序
    max_heap_sort_normal(test_list, test_list_length);
    printf("普通堆排序結(jié)果: \n");
    for (int i = 0; i < test_list_length; i++)
    {
        printf("%d ", test_list[i]);
    }
    printf("\n");

    return 0;
}

執(zhí)行結(jié)果參考:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肃弟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笤受,老刑警劉巖穷缤,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異箩兽,居然都是意外死亡津肛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門汗贫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來身坐,“玉大人,你說我怎么就攤上這事落包〔可撸” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵咐蝇,是天一觀的道長涯鲁。 經(jīng)常有香客問我,道長有序,這世上最難降的妖魔是什么抹腿? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮旭寿,結(jié)果婚禮上警绩,老公的妹妹穿的比我還像新娘。我一直安慰自己盅称,他們只是感情好肩祥,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著微渠,像睡著了一般搭幻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逞盆,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天檀蹋,我揣著相機與錄音,去河邊找鬼云芦。 笑死俯逾,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的舅逸。 我是一名探鬼主播桌肴,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼琉历!你這毒婦竟也來了坠七?” 一聲冷哼從身側(cè)響起水醋,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彪置,沒想到半個月后拄踪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡拳魁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年惶桐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潘懊。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡姚糊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出授舟,到底是詐尸還是另有隱情救恨,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布释树,位于F島的核電站忿薇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏躏哩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一揉燃、第九天 我趴在偏房一處隱蔽的房頂上張望扫尺。 院中可真熱鬧,春花似錦炊汤、人聲如沸正驻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姑曙。三九已至,卻和暖如春迈倍,著一層夾襖步出監(jiān)牢的瞬間伤靠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工啼染, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宴合,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓迹鹅,卻偏偏與公主長得像卦洽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斜棚,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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