堆排序,C 模板程式設計

2022-02-24 09:13:11 字數 2113 閱讀 2987

理論來自:簡明現代魔法

本文所說的堆,指的是前者。

堆排序的時間複雜度是o(nlgn),與快速排序達到相同的時間複雜度。但是在實際應用中,我們往往採用快速排序而不是堆排序。這是因為快速排序的乙個好的實現,往往比堆排序具有更好的表現。堆排序的主要用途,是在形成和處理優先順序佇列方面。另外,如果計算要求是類優先順序佇列(比如,只要返回最大或者最小元素,只有有限的插入要求等),堆同樣是很適合的資料結構。

基礎知識

堆一般用陣列表示,比如陣列a陣列的長度length(a),堆在陣列中的元素個數heapsize(a)。一般說來,heapsize(a) <= length(a),因為陣列a當中可能有一些元素不在堆中。

假設節點i是陣列a中下標為i的節點。

含有n個元素的堆a的高度是: floor(lgn)。

堆的基本操作

本來我只打算隨便寫個小程式的,但是發現,可以寫個更通用的程式。以最小堆為例,說下建堆和排序的過程。

經過上面兩個步驟,就成功的建立了乙個最小堆。排序的過程就是取出堆頂元素push到臨時陣列,然後將堆頂元素和最後乙個元素交換,再pop掉最後乙個元素,直到堆中沒有元素。這樣就獲得了乙個有序的陣列,然後在複製到堆中。

完整程式如下:

//

最小堆排序和最大堆排序

#include

#include

#include

#include

using

namespace

std;

template

class

heap

template

void

sort(compare comp);

void printarray(const vector&a_array);

private

: vector

m_array;

//comp 為less則大數下沉,建立最小堆,從小到大排序

//comp 為greater則小數下沉,建立最大堆,從大到小排序

templatevoid creatheap(compare comp); //

建立堆template

void downelement(int a_elem, compare comp); //

下沉元素

};template

template

void heap::sort(compare comp)

printarray(array);

m_array.assign(array.begin(),array.end());

}template

template

void heap::creatheap(compare comp)

}template

template

void heap::downelement(int a_elem, compare comp) //

下沉元素

}//同子節點比較,若父節點最小則結束

if(comp(m_array[index],m_array[min]))

else

//選最小元素到父節點

}}template

void heap::printarray(const vector&a_array)

cout

<

}int

main()

random_shuffle(array.begin(), array.end());

//打亂順序

heapheap(array);

heap.sort(less

());

heap.sort(greater

());

return0;

}

堆排序 模板 堆排序

biu 堆排序是乙個不穩定的排序演算法,對資料不敏感,時間複雜度穩定,主要分為兩部分 建堆 堆排序。其中建堆的時間複雜度是 o n o n o n 的,而排序選出乙個最大 最小值的過程是 o l ogn o logn o logn 的,一共需要n次操作,故總共的時間複雜度是 o n logn o n...

堆排序 模板

很認真地看完了 算導 的排序之前的所有部分,除了演算法複雜度那一章的數學要求太高,難以完全駕馭以外,其他的部分還是很好理解的。爭取把 算導 裡面出現的演算法都自己實現,製作自己的模板,以後好用。堆排序雖然在一般的時候是沒有快排好用,但是在優先佇列裡面很好用,所以也是很有力的 這個堆排序模板是我基本完...

堆排序模板

最小堆刪除堆頂法排序 include int n 儲存堆中的陣列的個數 int h 101 存放堆的陣列 void swap x,y 交換堆中的兩個元素 void shiftdown int i 第i個位置向下調整 if t i else flag 1 return void creat intde...