吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

難度系數(shù)最高之堆排序簡介

學益得智能硬件 ? 來源:學益得智能硬件 ? 2023-02-25 09:29 ? 次閱讀

今天來看一個比較復雜的排序,堆排序,先搞清楚原理,再寫代碼。

堆排序使用數(shù)據(jù)結(jié)構(gòu)中的堆來完成,那么問題來了,什么是堆?

有兩種,大頂堆和小頂堆,所謂大頂堆,就是任意一個雙親節(jié)點都比孩子節(jié)點大,比如圖上這樣的,小頂堆則反過來。

496617d8-b43f-11ed-bfe3-dac502259ad0.png

所以對于大頂堆來說,根節(jié)點一定是最大的。

比如有這樣一個數(shù)組,先把它畫成一顆二叉樹的形式,接下來就是構(gòu)建大頂堆,這個部分也是整個堆排序中最耗時的部分。

4b989846-b43f-11ed-bfe3-dac502259ad0.png

從0這個節(jié)點開始,因為節(jié)點0是最后一個有孩子的節(jié)點。

0比2小,交換一下位置。

4be1d10a-b43f-11ed-bfe3-dac502259ad0.png

再輪到4,8和9比較,顯然是9大,把9和4交換一下位置。

4cc4f00c-b43f-11ed-bfe3-dac502259ad0.png

最后輪到3,9比2大,9和3需要交換一下位置。

4de944a6-b43f-11ed-bfe3-dac502259ad0.png

注意,因為這個節(jié)點發(fā)生了變化,所以3 8 4不再滿足條件,還得繼續(xù)調(diào)整。8比4大,8和3交換一下位置。

4ec34c46-b43f-11ed-bfe3-dac502259ad0.png

這個過程就是構(gòu)建大頂堆。

于是,我們得到了最大的數(shù)字9,把它和最后一個數(shù)字做交換,然后斷開,意思就是后面的操作跟9沒有關系了。

4ee1fd1c-b43f-11ed-bfe3-dac502259ad0.png

接下來就是調(diào)整大頂堆,不需要再像剛才那樣構(gòu)建,因為這顆二叉樹也只有根節(jié)點被修改了。

0和8交換,4和0交換,又得到了第二大的數(shù)字8。

4fe981da-b43f-11ed-bfe3-dac502259ad0.png

不斷的重復,最后就是一個有序的序列。

寫代碼之前,還得明確一個問題,雖然我們一直在操作二叉樹,但是寫代碼的時候并不需要真的去創(chuàng)建一顆二叉樹,我們只是在操作數(shù)組的下標,比如下標為n的節(jié)點作為根幾點,那么他的左孩子就是 2n+1,右孩子就是2n+2。

#include 


void adjust_heap_sort(int *a, int root, int last)
{
    int child;


    while (1)
    {
        child = 2 * root + 1;
        if (child > last)
            break;


        if (child + 1 <= last && a[child] < a[child + 1])
        {
            child++;
        }


        if (a[child] > a[root])
        {
            int num = a[root];
            a[root] = a[child];
            a[child] = num;
        }


        root = child;
    }
}


void heap_sort(int *a, int size)
{
    //構(gòu)建大頂堆
    for (int i = size / 2 - 1; i >= 0; i--)
    {
        adjust_heap_sort(a, i, size - 1);
    }


    //調(diào)整大頂堆
    for (int i = size - 1; i > 0; i--)
    {
        int num = a[0];
        a[0] = a[i];
        a[i] = num;


        adjust_heap_sort(a, 0, i - 1);
    }
}


int main()
{
    int array[] = {3, 4, 0, 8, 9, 2};


    heap_sort(array, 6);


    for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++)
    {
        printf("%d ", array[i]);
    }
    printf("
");


    return 0;
}
代碼確實不太容易理解,不過在這些排序算法中,越是不容易理解的,效率也就越高,還是用它和冒泡做個對比,10000個數(shù)據(jù),差距還是很大的。
root@Turbo:test# time ./heap_sort 


real  0m0.005s
user  0m0.004s
sys  0m0.000s
root@Turbo:test# time ./bubble_sort 


real  0m0.606s
user  0m0.554s
sys  0m0.000s
root@Turbo:test#




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 交換機
    +關注

    關注

    21

    文章

    2656

    瀏覽量

    100179
  • 二叉樹
    +關注

    關注

    0

    文章

    74

    瀏覽量

    12375

原文標題:難度系數(shù)最高-堆排序

文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FPGA排序-冒泡排序介紹

    排序算法是圖像處理中經(jīng)常使用一種算法,常見的排序算法有插入排序、希爾排序、選擇排序、冒泡排序、歸
    發(fā)表于 07-17 10:12 ?1149次閱讀
    FPGA<b class='flag-5'>排序</b>-冒泡<b class='flag-5'>排序</b>介紹

    排序算法選擇排序

    選擇排序: (Selection sort)是一種簡單直觀的排序算法,也是一種不穩(wěn)定的排序方法。 選擇排序的原理: 一組無序待排數(shù)組,做升序排序
    的頭像 發(fā)表于 09-25 16:30 ?2118次閱讀
    <b class='flag-5'>排序</b>算法<b class='flag-5'>之</b>選擇<b class='flag-5'>排序</b>

    十種常用排序法詳解總結(jié)和比較選擇

    (nlgn)的排序方法:快速排序堆排序或歸并排序。  快速排序是目前基于比較的內(nèi)部排序中被認為
    發(fā)表于 10-26 15:11

    常用排序法之一 ——冒泡排序法和選擇排序

    語言中,常用的算法有:冒泡排序、快速排序、插入排序、選擇排序、希爾排序堆排序以及歸并
    發(fā)表于 11-01 12:25

    C語言教程之幾種排序算法

    數(shù)據(jù)結(jié)構(gòu)的排序算法有很多種。 其中, 快速排序 、希爾排序堆排序、直接選擇排序不是穩(wěn)定的排序
    發(fā)表于 11-16 10:23 ?1780次閱讀

    c語言排序算法選擇排序

    應廣大"鳥友"強烈要求,小編將會推出《排序系列》,給大家講講排序那些事。? ? ? ? ?那么今天首先給大家講解最符合人類思維邏輯的超簡單排序法?《選擇排序法》。? ? ? ? ?顧名
    發(fā)表于 11-16 10:25 ?3455次閱讀
    c語言<b class='flag-5'>排序</b>算法<b class='flag-5'>之</b>選擇<b class='flag-5'>排序</b>法

    基于C語言二分查找排序源代碼

    本文檔內(nèi)容介紹了C語言歸并、選擇、直接插入、希爾、冒泡、快速、堆排序與順序、二分查找排序源代碼,分享給大家供大家參考。
    發(fā)表于 01-04 11:24 ?1次下載

    常用排序算法分析

    一種是比較排序,時間復雜度O(nlogn) ~ O(n^2),主要有:冒泡排序,選擇排序,插入排序,歸并排序
    的頭像 發(fā)表于 07-13 16:13 ?2204次閱讀

    區(qū)塊鏈挖礦難度系數(shù)設計的java實現(xiàn)

    先給大家介紹區(qū)塊鏈挖礦難度系數(shù)的概念。區(qū)塊鏈的難度系數(shù):是設計區(qū)塊鏈挖礦難易的關鍵因子,難度系數(shù)
    的頭像 發(fā)表于 10-18 09:24 ?4380次閱讀

    幾種c語言程序的排序包括應用程序等資料免費下載

    本文檔的主要內(nèi)容詳細介紹的是幾種c語言程序的排序包括應用程序好資料免費下載包括了:堆排序,改進冒泡排序,歸并排序,簡單插入排序,簡單選擇
    發(fā)表于 09-29 08:00 ?6次下載
    幾種c語言程序的<b class='flag-5'>排序</b>包括應用程序等資料免費下載

    你知道如何實現(xiàn)區(qū)塊鏈難度系數(shù)

    區(qū)塊鏈的難度系數(shù):是設計區(qū)塊鏈挖礦難易的關鍵因子,難度系數(shù)越低,挖礦越容易。難度系數(shù)越高,相應越
    發(fā)表于 12-18 10:42 ?2762次閱讀

    C語言排序堆排序的技巧

    調(diào)整,使得子節(jié)點永遠小于父節(jié)點 創(chuàng)建最大堆(Build Max Heap):將堆中的所有數(shù)據(jù)重新排序 堆排序(HeapSort):移除位在第一個數(shù)據(jù)的根節(jié)點,并做最大堆調(diào)整的遞歸運算。 C代碼實現(xiàn) 代碼看起來比較抽象,將代碼運行時數(shù)據(jù)交換的過程打印出來,然后
    的頭像 發(fā)表于 07-29 15:29 ?1272次閱讀
    C語言<b class='flag-5'>排序</b>中<b class='flag-5'>堆排序</b>的技巧

    解析數(shù)據(jù)結(jié)構(gòu)的常用七大排序算法

    為了讓大家掌握多種排序方法的基本思想,本篇文章帶著大家對數(shù)據(jù)結(jié)構(gòu)的常用七大算法進行分析:包括直接插入排序、希爾排序、冒泡排序、快速排序、簡單
    的頭像 發(fā)表于 03-16 08:22 ?1735次閱讀

    2分鐘看懂快速排序的算法

    之前有同學提出想要復習一下排序算法,那我們今天就挑一個難度中等的,快速排序
    的頭像 發(fā)表于 02-25 09:32 ?862次閱讀

    隨機數(shù)字排序教程

    本次實驗我們利用對隨機數(shù)字進行排序來給大家介紹排序算法的實現(xiàn),常見的快速排序、歸并排序堆排序、冒泡排序
    的頭像 發(fā)表于 03-24 14:55 ?1031次閱讀
    隨機數(shù)字<b class='flag-5'>排序</b>教程
    百家乐平一直压庄| 将军百家乐官网的玩法技巧和规则| 大发888娱乐成| 百家乐官网连线游戏下载| 百家乐太阳城 | 美高梅百家乐娱乐城| 汨罗市| 金矿百家乐的玩法技巧和规则| 百家乐官网说明| 娱乐城注册送彩金| 百家乐微心打法| 百家乐官网技巧阅读| 全迅网百家乐的玩法技巧和规则 | 百家乐官网双龙出海| 现金轮盘游戏| 百家乐赌场牌路分析| 百家乐官网为什么庄5| 威尼斯人娱乐场xpjgw5xsjgw| 寅午戌 24山图| 菲彩线上娱乐| 百家乐双龙出海| 狮威百家乐官网娱乐网| 永利博线上娱乐| 筹码百家乐的玩法技巧和规则 | 百家乐注册| 定襄县| 至富百家乐的玩法技巧和规则| 大三巴百家乐官网的玩法技巧和规则| 百家乐必胜法| 总玩百家乐有赢的吗| 百家乐最全打法| 澳门百家乐官网先赢后输| 大发888真钱帐户注册| 博彩百家乐网址| 里尼的百家乐官网策略| 新葡京国际娱乐城| 单机百家乐的玩法技巧和规则 | 江西省| 大发888娱乐城出纳柜台| 百家乐游戏辅助| 风水24山子怎么读|