欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言數(shù)據(jù)結(jié)構(gòu)之堆排序詳解

 更新時(shí)間:2022年03月10日 11:21:39   作者:清歡有道  
堆是計(jì)算機(jī)科學(xué)中一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱,通常是一個(gè)可以被看做一棵完全二叉樹的數(shù)組對象。而堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。本文將通過圖片詳細(xì)介紹堆排序,需要的可以參考一下

1.堆的概念及結(jié)構(gòu)

如果有一個(gè)關(guān)鍵碼的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉樹(二叉樹具體概念參見——二叉樹詳解)的順序存儲方式存儲在一個(gè)一維數(shù)組中,并滿足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,則稱為小堆(或大堆)。將根節(jié)點(diǎn)最大的堆叫做最大堆或大根堆,根節(jié)點(diǎn)最小的堆叫做最小堆或小根堆。

堆的性質(zhì):

  • 堆中某個(gè)節(jié)點(diǎn)的值總是不大于或不小于其父節(jié)點(diǎn)的值;
  • 堆總是一棵完全二叉樹。

2.堆的實(shí)現(xiàn)

堆的實(shí)現(xiàn)請參見——二叉樹詳解(堆的實(shí)現(xiàn))

2.1 堆的向下調(diào)整算法

(此文章都已建小堆為例)

向下調(diào)整算法前提:當(dāng)前樹左右子樹都是小堆

核心思想:選出左右孩子中小的那個(gè),和父親交換,小的往上浮,大的往下沉,這里是小堆,如果是大堆則相反。

代碼實(shí)現(xiàn)

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}
//堆向下調(diào)整算法
void AdjustDown(int *a, int n, int root)
{
    int parent = root;
    int child = parent * 2 + 1;
    while (child<n)
    {
        //保證孩子節(jié)點(diǎn)child為兩個(gè)孩子中的最小值;保證不越界
        if (a[child] > a[child + 1] && child+1 < n)
            ++child;
        if (a[child] < a[parent])
        {
            swap(&a[child], &a[parent]);
            parent = child;
            child = parent * 2 + 1;
        }
        else
            break;
    }
}

2.2 堆的向上調(diào)整算法

使用場景:向上調(diào)整算法適用于向堆中插入數(shù)據(jù),當(dāng)向堆中插入數(shù)據(jù)就可能會導(dǎo)致堆失去大堆或者小堆的性質(zhì),此時(shí)需要重新調(diào)整,向上調(diào)整的思路與向下調(diào)整算法的思路類似,向上調(diào)整算法只需要從插入結(jié)點(diǎn)位置開始和父節(jié)點(diǎn)比較。

圖示:

代碼實(shí)現(xiàn):

void AdjustUp(int *a, int child)
{
    int parent = (child - 1) / 2;
    while (child > 0)
    {
        if (a[parent] > a[child])
        {
            swap(&a[parent], &a[child]);
            child = parent;
            parent = (child - 1) / 2;
        }
        else
            break;
    }
}

2.3 建堆(數(shù)組)

從最后一個(gè)非葉子節(jié)點(diǎn)位置行依次開始調(diào)整,如圖:

代碼實(shí)現(xiàn):

int parent = (n-2) / 2;
    //首先對每一個(gè)非葉子節(jié)點(diǎn)進(jìn)行一次向下調(diào)整算法,保證每個(gè)非葉子節(jié)點(diǎn)的
    //孩子都小于它的父節(jié)點(diǎn),然后可得到最小值,就在堆的頂端的父節(jié)點(diǎn)(也叫做建小堆)
    while (parent >= 0)
    {
        AdjustDown(a, n, parent);
        --parent;
    }

2.4 堆排序

升序建大堆,降序建小堆

void HeapSort(int *a, int n)
{
    int parent = (n-2) / 2;
    //首先對每一個(gè)非葉子節(jié)點(diǎn)進(jìn)行一次向下調(diào)整算法,保證每個(gè)非葉子節(jié)點(diǎn)的
    //孩子都小于它的父節(jié)點(diǎn),然后可得到最小值,就在堆的頂端的父節(jié)點(diǎn)(也叫做建小堆)
    while (parent >= 0)
    {
        AdjustDown(a, n, parent);
        --parent;
    }
    int end = n-1;
    while (end>0)
    {
        //將堆頂?shù)臄?shù)與最后的end,以此循環(huán),進(jìn)行交換就可得到有序序列
        //注意:建小堆,得到降序序列
        swap(&a[end], &a[0]);
        AdjustDown(a, end, 0);
        --end;
    }
}

2.5 堆排序的時(shí)間復(fù)雜度

所以建堆時(shí)間復(fù)雜度為O(N);

向下調(diào)整算法時(shí)間復(fù)雜度 O(logN);

所以堆排序的時(shí)間復(fù)雜度為 O(N*logN)

以上就是C語言數(shù)據(jù)結(jié)構(gòu)之堆排序詳解的詳細(xì)內(nèi)容,更多關(guān)于C語言堆排序的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(92.倒置鏈表之二)

    C++實(shí)現(xiàn)LeetCode(92.倒置鏈表之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(倒置鏈表之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言中的文件讀寫fseek 函數(shù)

    C語言中的文件讀寫fseek 函數(shù)

    這篇文章主要介紹是我是C語言中的文件讀寫fseek 函數(shù)的相關(guān)資料,fseek 函數(shù)用來移動文件流的讀寫位置;就好比播放器,可以直接拖拽到精彩的時(shí)間點(diǎn)一樣,下面我們就來詳細(xì)介紹該內(nèi)容吧,感興趣的小伙伴可以參考一下
    2021-10-10
  • VC++?2019?"const?char*"類型的實(shí)參與"LPCTSTR"類型的形參不兼容解決

    VC++?2019?"const?char*"類型的實(shí)參與"LPCTSTR"

    這篇文章主要給大家介紹了關(guān)于VC++?2019?"const?char*"類型的實(shí)參與"LPCTSTR"類型的形參不兼容的解決方法,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-03-03
  • C語言字符串與字符數(shù)組面試題中最易錯(cuò)考點(diǎn)詳解

    C語言字符串與字符數(shù)組面試題中最易錯(cuò)考點(diǎn)詳解

    這篇文章主要介紹了C語言字符串與字符數(shù)組面試題中最易錯(cuò)考點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口

    VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口

    這篇文章主要介紹了VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C++?左值引用與一級指針示例詳解

    C++?左值引用與一級指針示例詳解

    這篇文章主要介紹了C++?左值引用與一級指針,本文給大家介紹了C++?(左值)引用和指針簡介,結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • C/C++?Qt?MdiArea?多窗體組件應(yīng)用教程

    C/C++?Qt?MdiArea?多窗體組件應(yīng)用教程

    MDI窗體控件類似于畫布,該控件只具備展示窗體的功能,無法實(shí)現(xiàn)生成窗體,所以我們需要在項(xiàng)目中手動增加自定義的Dialog對話框,并對該對話框進(jìn)行一定的定制,這篇文章主要介紹了C/C++?Qt?MdiArea?多窗體組件應(yīng)用,需要的朋友可以參考下
    2021-12-12
  • c語言double類型默認(rèn)輸出小數(shù)幾位

    c語言double類型默認(rèn)輸出小數(shù)幾位

    在本篇文章里小編給大家分享的是關(guān)于c語言double類型默認(rèn)輸出小數(shù)幾位的相關(guān)知識點(diǎn),需要的朋友們可以學(xué)習(xí)下。
    2020-04-04
  • 一起來了解一下C++中的指針

    一起來了解一下C++中的指針

    這篇文章主要為大家詳細(xì)介紹了C++的指針,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 詳解原碼、反碼與補(bǔ)碼存儲與大小

    詳解原碼、反碼與補(bǔ)碼存儲與大小

    這篇文章主要介紹了詳解原碼、反碼與補(bǔ)碼存儲與大小的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評論