本章主要介紹「堆」和「優先佇列」資料結構的使用。
堆可分為大根堆和小根堆。堆是某個節點的值總是不大於(大根堆)或不小於(小根堆)其父節點的完全樹。常見的堆有二叉堆和斐波那契堆,本章講的是二叉堆。
由於二叉堆是完全二叉樹,所以我們在建堆的時候可以考慮用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...