<progress id="jlsnq"><code id="jlsnq"></code></progress>

<strong id="jlsnq"><del id="jlsnq"></del></strong>
    <mark id="jlsnq"></mark>

    <legend id="jlsnq"><table id="jlsnq"></table></legend>
    <small id="jlsnq"></small>
  • <ruby id="jlsnq"><table id="jlsnq"></table></ruby>

      <strong id="jlsnq"></strong>

      24小時聯系電話:18217114652、13661815404

      中文

      您當前的位置:
      首頁>
      電子資訊>
      技術專題>
      二進制堆排序算法說明

      技術專題

      二進制堆排序算法說明


      二進制堆排序算法說明

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

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

      當涉及二進制堆排序算法時,它有兩種類型。

      最大堆二叉樹,其父節點大于或等于其每個子節點。上面顯示的堆樹是最大堆樹的示例。

      最小堆二叉樹,其中所有父節點均小于或等于其每個子節點。

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

      二進制堆排序算法說明:

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

      讓我們根據給定的數字數組構造一個完整的二叉樹。通過以這種方式排列數組中的元素來構造樹,使其形成具有父節點和子節點的樹狀數據結構。

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

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

      其中最大的25個。

      7會被25交換,因為它大于7。

      將節點2543與它的父節點43進行比較。

      15在父節點中將被替換為43,因為相比而言,它在其他兩個節點中最大。

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

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

      交換

      去掉

      堆肥

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

      刪除數字43

      通過將最大值放在根節點或堆中來重建堆

      7交換25

      移除25

      通過將15放在頂部來進行堆肥

      7交換15

      移除15

      5交換7

      刪除7

      然后我們得到排序的數組

      然后我們得到排序的數組

      實現二進制堆排序算法的步驟:

      從輸入元素創建二叉樹

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

      比較父節點和子節點

      用最大的子節點替換父節點

      對所有父節點執行相同的操作

      重復直到對二叉樹中的所有節點進行排序并獲得最大堆

      然后將根節點與最后一個節點交換

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

      通過將最大值放到根節點或heapify來重建堆

      將根節點與最右邊的子節點進行比較

      重復相同的過程,直到所有節點都被整理到陣列中

      二進制堆排序算法的示例代碼:

      #include <stdio.h>

       //交換兩個元素位置的函數

       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;

       }

      請輸入搜索關鍵字

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

      <strong id="jlsnq"><del id="jlsnq"></del></strong>
        <mark id="jlsnq"></mark>

      <legend id="jlsnq"><table id="jlsnq"></table></legend>
      <small id="jlsnq"></small>
    1. <ruby id="jlsnq"><table id="jlsnq"></table></ruby>

        <strong id="jlsnq"></strong>