堆排序:主要是二叉堆,是乙個陣列,可以近似看作是一棵完全二叉樹。最壞情況執行時間為 n * log (n);
主要性質:
1.對於任意乙個下標index,書上寫的是左子女的下標為 2 * index,右子女為 2 * index + 1;但是在實際程式設計中,下標是從0開始的,所以下標的變化應該為:
左子女為2 * index + 1, 右子女為 2 * index + 2;
2.最大(小)堆:對於任意乙個非葉節點,它的值都大於(小於)等於它的子女節點。
下面是自己寫的**,只針對int型,並且針對最大堆,如果要對其他型別進行堆排序,那麼就要過載操作符。
heap.h
#ifndef heap_h
#define heap_h
#include #include class myheap
;#endif
3.上面實現堆排序的幾個重要的函式:
1)maxheaplify(),這個函式接受乙個陣列和乙個下標,用這個下標計算它的左右子女,進而和左右子女比較,如果根節點不是
最大的話,那就不滿足最大堆的性質,那麼就要把根節點和子女中的最大值**換,並且記錄下被交換子女的index,
然後再遞迴地呼叫這個函式,直到節點滿足最大堆的性質為止。
2)heapsort() buildmaxheap() 這兩個函式都會呼叫上面的函式,但是值得注意的是:buildmaxheap()這個函式的起始條件是
從第乙個非葉節點的節點開始呼叫maxheaplify(),而第乙個非葉節點的下標(按照書上來說是:陣列大小 / 2 並向下取整),
但是在實際程式設計中的非葉節點的下標為:(陣列大小 / 2 - 1)。
下面是cpp檔案:
#include "heap.h"
/*為什麼在堆排序的時候下面這個函式只用從根節點開始:
因為排序之前我們已經讓堆具有了最大堆的性質,所以交換節點之後根節點會違反最大堆的性質,而其他節點
會保持相應的最大堆的性質,沒有必要再從第乙個非葉節點開始呼叫函式。
為什麼不會把最大值再次調整到堆頂:
因為我們已經把未排序的陣列的大小「改變了」-通過乙個成員變數,所以最大值交換之後就會固定了,不會再被交換。
*/void myheap::buildmaxheap(int size)
}int myheap::getmax()
void myheap::heapsort() // heap sort;
} void myheap::printvector()
std::cout << std::endl;
}myheap::myheap(std::vector& row) : array(row),size(row.size()) //construct a heap as a max-heap;
void myheap::maxheaplify(std::vector& target,int index)
else
if(right < this->size && target[maxindex] < target[right]) //compare right child with max index,if right is bigger,then write down the max index;
if(maxindex != index) //if 'root' is max, end this function }
void myheap::swap(int& first, int& second)
myheap::~myheap()
最後是主函式:簡單試驗:
#include "heap.h"
int main()
; std::vectorv(a,a+16);
myheap test(v);
test.printvector();
test.heapsort();
test.printvector();
return 0;
}
g++ -o heap.h heap.cpp main.cpp
經過實驗,正常得到排序的結果
演算法導論 第六章《堆排序》
本章開始介紹了堆的基本概念,然後引入最大堆和最小堆的概念。全章採用最大堆來介紹堆的操作,兩個重要的操作是調整最大堆和建立最大堆,接著著兩個操作引進了堆排序,最後介紹了採用堆實現優先順序佇列。二叉 堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。除了最底層外,該樹是完全充滿的,而且是從左到右填充...
演算法導論 第六章 堆排序
二叉 堆資料結構是一種陣列物件,如下圖所知,他可以被視為一顆完全二叉樹。其有如下性質 1 對於i節點 i表示下標 其父節點為li 2 左孩子節點為2i,右孩子節點為2i 1 2 最大堆滿足 a parent i a i 最小堆滿足 a parent i a i 3 堆的高度為 lgn 4 子陣列元素...
演算法導論第六章堆排序6 2
6.2 1 第一遍交換10和3 第二遍交換10和9 6.2 2 6.2 2 min heapify a,i 1 l left i 2 r right i 3 if l heap size a and a l a i 4 then smallest l 5 else smallest i 6 if r...