資料結構-二元堆積(C描述)

來源:互聯網
上載者:User

1.主要的儲存結構

struct HeapStruct
{
  int Capacity;//最大容量
  int Size;//當前容量
  ElementType *Elements;//數組入口地址
};
typedef struct HeapStruct *PriorityQueue;

結構體HeapStruct實際上是一個數組,二元堆積的底層實現是一個完全二叉樹,因此可以很方便的使用數組實現。

完全二叉樹的一個重要性質是可以明確給出父子之間的位置關係:

設節點v的秩為i(設根節點秩為0),則

若v有左子,左子的秩=2 * i + 1;

若v有右子,右子的秩=2 * i + 2;

若v有父親,父親的秩=(i - 1) / 2;

2.主要堆操作

為了維持堆序性,主要涉及的堆操作有兩個,即插入與刪除節點。

2.1插入節點-O(logN)

插入節點的演算法為,

1.新節點插入堆尾。

2.迴圈比較該節點與它的父節點;

2.1若該節點<父節點,則交換之;

2.2否則,停止與當前位置,即為插入位置。

這個迴圈過程即為上濾過程。

這裡設定一個啞元節點Element[0],其中放入一個極小值,以便迴圈過程終止,這樣做可以避免在迴圈體內多加一條判斷語句。則現在堆頂為Element[1],父子之間的位置關係:

設節點v的秩為i(設根節點秩為1),則

若v有左子,左子的秩=2 * i;

若v有右子,右子的秩=2 * i + 1;

若v有父親,父親的秩=i / 2;

/* H->Element[ 0 ] is a sentinel */
void Insert( ElementType X, PriorityQueue H )
{
    int i;
    if( IsFull( H ) )
    {
        Error( "Priority queue is full" );
        return;
    }
    for( i = ++H->Size; H->Elements[ i / 2 ] > X; i /= 2 )
        H->Elements[ i ] = H->Elements[ i / 2 ];
    H->Elements[ i ] = X;
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.