精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

難度系數最高之堆排序簡介

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

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

堆排序使用數據結構中的堆來完成,那么問題來了,什么是堆?

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

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

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

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

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

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

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

注意,因為這個節點發生了變化,所以3 8 4不再滿足條件,還得繼續調整。8比4大,8和3交換一下位置。

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

這個過程就是構建大頂堆。

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

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

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

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

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

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

寫代碼之前,還得明確一個問題,雖然我們一直在操作二叉樹,但是寫代碼的時候并不需要真的去創建一顆二叉樹,我們只是在操作數組的下標,比如下標為n的節點作為根幾點,那么他的左孩子就是 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)
{
    //構建大頂堆
    for (int i = size / 2 - 1; i >= 0; i--)
    {
        adjust_heap_sort(a, i, size - 1);
    }


    //調整大頂堆
    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個數據,差距還是很大的。
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#




審核編輯:劉清

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

    關注

    21

    文章

    2623

    瀏覽量

    99269
  • 二叉樹
    +關注

    關注

    0

    文章

    74

    瀏覽量

    12313

原文標題:難度系數最高-堆排序

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

收藏 人收藏

    評論

    相關推薦

    FPGA排序-冒泡排序介紹

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

    排序算法選擇排序

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

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

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

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

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

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

    數據結構的排序算法有很多種。 其中, 快速排序 、希爾排序堆排序、直接選擇排序不是穩定的排序
    發表于 11-16 10:23 ?1748次閱讀

    c語言排序算法選擇排序

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

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

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

    常用排序算法分析

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

    區塊鏈挖礦難度系數設計的java實現

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

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

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

    你知道如何實現區塊鏈難度系數

    區塊鏈的難度系數:是設計區塊鏈挖礦難易的關鍵因子,難度系數越低,挖礦越容易。難度系數越高,相應越
    發表于 12-18 10:42 ?2660次閱讀

    C語言排序堆排序的技巧

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

    解析數據結構的常用七大排序算法

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

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

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

    隨機數字排序教程

    本次實驗我們利用對隨機數字進行排序來給大家介紹排序算法的實現,常見的快速排序、歸并排序堆排序、冒泡排序
    的頭像 發表于 03-24 14:55 ?974次閱讀
    隨機數字<b class='flag-5'>排序</b>教程