演算法導論第六章 堆排序

2021-07-11 06:21:55 字數 2181 閱讀 1524

堆排序:主要是二叉堆,是乙個陣列,可以近似看作是一棵完全二叉樹。最壞情況執行時間為 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...