程式設計珠璣(2)第十四章學習筆記之「堆」

2021-06-14 09:23:22 字數 1438 閱讀 6976

本章主要介紹「堆」和「優先佇列」資料結構的使用。

堆可分為大根堆和小根堆。堆是某個節點的值總是不大於(大根堆)或不小於(小根堆)其父節點的完全樹。常見的堆有二叉堆和斐波那契堆,本章講的是二叉堆。

由於二叉堆是完全二叉樹,所以我們在建堆的時候可以考慮用c++中的vector來作為儲存結構。

堆有兩個比較重要的操作:插入和刪除。插入時,我們一般將新插入的元素放在末尾,這時需要做向上調整;刪除時一般是刪除「根」節點元素,這時需要做向下調整,以確保堆的性質。

所謂優先佇列是不同於先進先出的普通佇列,而是每次從佇列中取出具有最高優先權的元素。根據優先佇列這一特點(每次取出最高優先權的元素),我們可以很自然地想到用堆來實現優先佇列。補充一句:優先佇列是乙個非常有用的資料結構,在實際的程式設計中常常用到,在c++中有模板庫,可以直接呼叫。

具體實現見**:

#include#include#includeusing namespace std;

//堆資料結構的實現(小根堆)

template class heap

heap(t elements, int arraysize)

else

currentindex = parentindex;

} }t remove() throw(runtime_error)

t removedelement = v[0];

v[0] = v[v.size()-1];

v.pop_back();

int currentindex = 0;

while(currentindex < v.size())

}if(v[currentindex] > v[minindex])

else

} return removedelement;

} int getsize()

private:

vectorv;

};//利用堆實現的優先佇列(每次彈出最小的元素)

template class priorityqueue

void enqueue(t element)

t dequeue() throw (runtime_error)

int getsize()

private:

heapheap;

};//堆排序的實現

void heapadjust(int a, int s, int m)

a[s] = a[j];

s = j;

} a[s] = temp;

}void heapsort(int a, int n)

for(i=n-1; i>0; i--)

}int main()

; heapsort(a, 7);

for(int i=0; i<7; i++)

return 0;

}

UNP 學習筆記 第十四章

基於多程序伺服器,稍微修改head.h,測試各種io函式 void client echo int sockfd void serv echo int sockfd include include include include include include include include int...

C Primer Plus 筆記第十四章

本章內容包括 has a關係 包含物件成員的類 模板類valarray 私有和保護繼承 多重繼承 虛基類 建立類模板 使用類模板 模板的具體化 c 的乙個主要目標是促進 重用,公有繼承是實現這種目標的機制之一,但並不是唯一的機制,本章介紹其他方法 1.使用類成員 本身是另乙個類的物件,這種方法稱為包...

程式設計珠璣 第十四章 堆(排序,優先順序佇列)

一,堆 1 堆 任何結點的值都小於或等於其孩子的值的完全二叉樹為小根堆 任何結點的值都大於或等於其孩子的值的完全二叉樹為大根堆 為了方便使用完全二叉樹的性質,陣列從下標1開始。這樣 leftchild 2 i rightchild 2 i 1 parent i 2 null i 1 or i n 2...