演算法分析
堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。
堆的定義如下:具有n個元素的序列(k1,k2,…,kn),當且僅當滿足
;#elif defined(invert)
int arr[n]=;
#else
int arr[n]=;
#endif
int step=0;
/* 列印陣列 */
void print(int
array)
/* * 函式功能:根據陣列array構建大頂堆
* array:待調整的堆陣列,i:待調整的陣列元素的位置(自跟到葉調整),nlength:陣列的長度
*/void heapadjust(int
array,int i,int nlength)
else
break; //無需調整,退出迴圈
}}/* 堆排序演算法 */
void heapsort(int
array,int length)
}void main()
結果
before...
no.063
9724
518 sorting...
heap ready: no.098
6724
513swap(3,9) no.138
6724
519 heapadjust no.187
6324
519swap(1,8) no.217
6324
589 heapadjust no.273
6124
589swap(5,7) no.353
6124
789 heapadjust no.363
5124
789swap(4,6) no.443
5126
789 heapadjust no.453
4126
789swap(2,5) no.523
4156
789 heapadjust no.543
2156
789swap(1,4) no.613
2456
789 heapadjust no.631
2456
789swap(2,3) no.721
3456
789 heapadjust no.721
3456
789swap(1,2) no.812
3456
789 heapadjust no.812
3456
789 sorted.
(1)時間複雜度:平均效能o(
n∗logn
) ,最壞最好效能均為o(
n∗logn
) ;空間複雜度:堆排序是就地排序,僅需乙個交換用的輔助空間,輔助空間為o(
1)。
設樹深度為k=(2)堆排序不適宜於記錄數較少的情況,因為執行時間將主要耗費在建初始堆和調整建新堆時進行的反覆「篩選」上。log2n+
1 。從根到葉的篩選,元素比較次數至多2(k-1)次,交換記錄至多k 次。所以,在建好堆後,排序過程中的篩選次數不超過下式: 2(
log2(n
−1)+
log2(n
−2)+
⋯+log22)
而建堆時的比較次數不超過4n 次,因此堆排序最壞情況下,時間複雜度也為: o
(nlo
gn) 。
(3)堆排序是不穩定的排序方法。(排序的穩定性是指如果在排序的序列中,存在前後相同的兩個元素的話,排序前和排序後他們的相對位置不發生變化)
(4)當想得到乙個序列中第k個最小的元素之前的部分排序序列,最好採用堆排序。因為堆排序的時間複雜度是o(
n+klogn)
,若k≤
n/(logn)
,則可得到的時間複雜度為o(n)。
004 選擇排序 堆排序(Heap Sort)
即第乙個元素 必為最小項 小頂堆 若以一維陣列儲存乙個堆,則堆對應一棵完全二叉樹,且所有非葉結點的值均不大於 或不小於 其子女的值,根結點 堆頂元素 的值是最小 或最大 的。如 調整它們的儲存序,使之成為乙個堆,將堆頂元素輸出,得到n 個元素中最小 或最大 的元素,這時堆的根節點的數最小 或者最大 ...
排序 堆排序(heapSort)
時間複雜度 o nlog n 空間複雜度 o 1 不穩定 把此序列對應的二維陣列看成乙個完全二叉樹。那麼堆的含義就是 完全二叉樹中任何乙個非葉子節點的值均不大於 或不小於 其左,右孩子節點的值。由上述性質可知大頂堆的堆頂的關鍵字肯定是所有關鍵字中最大的,小頂堆的堆頂的關鍵字是所有關鍵字中最小的。因此...
堆排序練習(Heap Sort
一.目的以及背景知識 進行堆排序練習,掌握堆的構建與輸出。堆定義 對於序列a 1,n 對於任意i都有a i a 2i a i a 2 i 1 則該序列稱為大頂堆或者最大堆。反之則成為最小堆。堆篩選或堆調整 從最後乙個葉子結點開始篩選出該節點的兄弟結點與父節點中最大或最小的元素與父節點交換。建堆演算法...