理論來自:簡明現代魔法
本文所說的堆,指的是前者。
堆排序的時間複雜度是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...