簡體   English   中英

最大堆的數組表示

[英]Array representation of max heap

我正在嘗試創建一個最大堆,邏輯很簡單,如果父級小於子項之一,則將其交換。 我嘗試使用實現

void maxHeapify( int i , int *a , int n ){

    int largest = i;
    int left    = ( i * 2 ) + 1;
    int right    = ( i * 2 ) + 2;

    if( left < n && a[ largest] < a[ left ])
        largest = left;
    if( right < n  && a[ largest ] < a[right])
        largest = right;
    if( largest != i ){
        swap( a[i], a[largest]);
        maxHeapify( largest , a,  n );
    }
}


int main(){
    int n;
    int * a;
    cout << "Number of elements : ";
    cin >> n ;
    a = new int[n];
    for( int i = 0; i < n ; i++){
        cin >> a[i];
    }

    for( int i = n/2 -1 ; i >= 0 ; i-- ){
        maxHeapify( i , a, n);
    }
    for(int i = 0; i < n ; i++){
        cout << a[i] << " ";
    }

    return 0;
}

我正在使用輸入

2 7 26 25 19 17 1 90 3 36

樹應該像

90
      36    17
   25   26 7   1
 2   3 19

所以數組的表示應該是90 36 17 25 26 7 1 2 3 19但是代碼的輸出是

90 36 26 25 19 17 1 7 3 2

我查了一下,在許多教程中發現了許多相同的代碼。 數組中樹的輸出isnt表示如何? 我誤會了嗎?

感謝您的解釋

您為什么期望堆以特定方式顯示? 這些輸入數字可以通過多種方式排列到堆中。 您得到的結果也是一個有效的堆-每個父級大於其子級:

        90
    36      26
 25   19  17  1
7 3  2

最終的堆結構將根據插入順序和初始結構而有所不同。 在您的情況下,如果您從空堆開始,以給定的順序插入元素,並在每次插入后進行堆放,那么您將獲得2 7 26 25 19 17 1 90 3 36結果。

此代碼將產生您期望的結果:

std::vector<int> b = {2, 7, 26, 25, 19, 17, 1, 90, 3, 36};
auto it = b.begin();
while (it != b.end())
{
    std::make_heap(b.begin(), it+1);
    ++it;
}

但是,您的代碼所做的是將所有元素預插入堆中,然后對其進行排列,這等效於此:

std::vector<int> b = {2, 7, 26, 25, 19, 17, 1, 90, 3, 36};
std::make_heap(b.begin(), b.end());

兩種結果均有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM