• <noframes id="6fok0"><bdo id="6fok0"><listing id="6fok0"></listing></bdo>
    <ruby id="6fok0"></ruby>

    <progress id="6fok0"></progress>
  • <progress id="6fok0"></progress>
    <ruby id="6fok0"><table id="6fok0"></table></ruby>
  • <progress id="6fok0"><u id="6fok0"><form id="6fok0"></form></u></progress>

    24小時(shí)聯(lián)系電話(huà):18217114652、13661815404

    中文

    您當前的位置:
    首頁(yè)>
    電子資訊>
    技術(shù)專(zhuān)題>
    二進(jìn)制堆排序算法說(shuō)明

    技術(shù)專(zhuān)題

    二進(jìn)制堆排序算法說(shuō)明


    二進(jìn)制堆排序算法說(shuō)明

    二進(jìn)制堆排序算法使用二進(jìn)制樹(shù)執行排序操作。二叉樹(shù)是由數組中的元素構建而成的結構,如下圖所示以樹(shù)的形式顯示。二進(jìn)制堆樹(shù)有兩種類(lèi)型,max-heapmin-heap。

    同樣值得注意的是,還有其他排序算法,例如Bubble排序,Selection排序,Insertion排序和Merge排序來(lái)對給定數組中的元素進(jìn)行排序。

    當涉及二進(jìn)制堆排序算法時(shí),它有兩種類(lèi)型。

    最大堆二叉樹(shù),其父節點(diǎn)大于或等于其每個(gè)子節點(diǎn)。上面顯示的堆樹(shù)是最大堆樹(shù)的示例。

    最小堆二叉樹(shù),其中所有父節點(diǎn)均小于或等于其每個(gè)子節點(diǎn)。

    堆排序通過(guò)刪除節點(diǎn)中最大或最小的元素并將其放入數組中來(lái)執行排序。每次提取之后,將更新堆以維護堆屬性。為了更好地解釋這一點(diǎn),請看以下示例

    二進(jìn)制堆排序算法說(shuō)明:

    考慮以下具有五個(gè)數字的數組。我們需要使用Max-heap以升序對它進(jìn)行排序。

    讓我們根據給定的數字數組構造一個(gè)完整的二叉樹(shù)。通過(guò)以這種方式排列數組中的元素來(lái)構造樹(shù),使其形成具有父節點(diǎn)和子節點(diǎn)的樹(shù)狀數據結構。

    該樹(shù)必須是完整的二叉樹(shù)才能成為堆數據結構。有兩種類(lèi)型的節點(diǎn),父節點(diǎn)和子節點(diǎn)。子節點(diǎn)是附加到單個(gè)節點(diǎn)(即其父節點(diǎn))的節點(diǎn)。在下面的二叉樹(shù)中,15是父節點(diǎn),743是其子節點(diǎn)。同樣,在下一級的二叉樹(shù)7中,父節點(diǎn)– 255是子節點(diǎn)。

    我們需要將父節點(diǎn)與子節點(diǎn)(7、25、5)進(jìn)行比較。

    其中最大的25個(gè)。

    7會(huì )被25交換,因為它大于7。

    將節點(diǎn)2543與它的父節點(diǎn)43進(jìn)行比較。

    15在父節點(diǎn)中將被替換為43,因為相比而言,它在其他兩個(gè)節點(diǎn)中最大。

    因此,我們得到了我們的最大堆

    現在我們需要構造排序后的數組。為此,涉及三個(gè)步驟。

    交換

    去掉

    堆肥

    首先將根節點(diǎn)與最后一個(gè)節點(diǎn)交換。因為我們知道這是最大堆,所以根節點(diǎn)在所有節點(diǎn)中最大,而5在最小節點(diǎn)中。

    刪除數字43

    通過(guò)將最大值放在根節點(diǎn)或堆中來(lái)重建堆

    7交換25

    移除25

    通過(guò)將15放在頂部來(lái)進(jìn)行堆肥

    7交換15

    移除15

    5交換7

    刪除7

    然后我們得到排序的數組

    然后我們得到排序的數組

    實(shí)現二進(jìn)制堆排序算法的步驟:

    從輸入元素創(chuàng )建二叉樹(shù)

    您需要根據需要執行的排序類(lèi)型將其設置為最大堆或最小堆。

    比較父節點(diǎn)和子節點(diǎn)

    用最大的子節點(diǎn)替換父節點(diǎn)

    對所有父節點(diǎn)執行相同的操作

    重復直到對二叉樹(shù)中的所有節點(diǎn)進(jìn)行排序并獲得最大堆

    然后將根節點(diǎn)與最后一個(gè)節點(diǎn)交換

    刪除該節點(diǎn),因為這是最大值,并根據排序順序將其放入數組的最右側或數組的最左側

    通過(guò)將最大值放到根節點(diǎn)或heapify來(lái)重建堆

    將根節點(diǎn)與最右邊的子節點(diǎn)進(jìn)行比較

    重復相同的過(guò)程,直到所有節點(diǎn)都被整理到陣列中

    二進(jìn)制堆排序算法的示例代碼:

    #include <stdio.h>

     //交換兩個(gè)元素位置的函數

     void swapint * a,int * b{

       int temp = * a;

       * a = * b;

       * b =溫度;

     }

     void heapifyint arr [],int n,int i{

       //在根,左子和右子中找到最大的

       int最大= i;

       左整數= 2 * i + 1;

       正確的整數= 2 * i + 2;

       如果(左<n && arr [left]> arr [largest]

         最大=左;

       如果(正確<n && arr [正確]> arr [最大]

         最大=正確;

       //如果根不是最大,交換并繼續堆

       如果(最大!= i{

         swap(&arr [i],&arr [large];

         heapifyarr,n,最大);

       }

     }

     //主函數做堆排序

     void heapSortint arr [],int n{

       //建立最大堆

       對于(int i = n / 2-1; i> = 0; i--

         heapifyarr,n,i;

       //堆排序

       對于(int i = n-1; i> = 0; i--{

         swap(&arr [0],&arr [i];

         //重整根元素以再次在根上獲得最高元素

         heapifyarr,i,0;

       }

     }

     //打印數組

     void printArrayint arr [],int n{

       對于(int i = 0; i <n; ++ i

         printfd”,arr [i];

       printf“ \ n”;

     }

     //主要代碼

     int main(){

       int arr [] = {15,7,43,25,5};

       int n = sizeofarr/ sizeofarr [0];

       heapSortarr,n;

       printf排序數組為\ n”;

       printArrayarr,n;

     }

    請輸入搜索關(guān)鍵字

    確定
    色鲁99热99re超碰精品_91精品一区二区三区无码吞精_亚洲国产欧洲综合997久久_一级a性色生活片久久无
  • <noframes id="6fok0"><bdo id="6fok0"><listing id="6fok0"></listing></bdo>
    <ruby id="6fok0"></ruby>

    <progress id="6fok0"></progress>
  • <progress id="6fok0"></progress>
    <ruby id="6fok0"><table id="6fok0"></table></ruby>
  • <progress id="6fok0"><u id="6fok0"><form id="6fok0"></form></u></progress>