建堆:o(n*lgn)
插入:o(lgn)
刪除:o(lgn)
也分析了為什麼優先順序佇列的底層要用堆!!如果上篇關於堆的文章看懂之後,下邊的堆排序就比較好寫了。
我們知道堆的特點是:第乙個元素要麼是最大值(大堆),要麼是最小值(小堆),這樣在排序的時候,直接將第乙個
元素和最後乙個元素進行交換,然後從第乙個元素開始進行向下調整。
所以,如果需要公升序,就建乙個大堆,需要降序,就建乙個小堆。
下邊用再來說明這樣乙個過程:
【實現**】
#include
using namespace std;
void adjustdown(int a,size_t i,size_t len)
else
break; }}
void heapsort(int a, size_t n)
/*for (size_t i = 0;i < n;++i)
*/ for (size_t i = n-1;i > 0;--i) }
void show(int a,size_t n)
cout << endl;
}void testsort()
; heapsort(a,7);
show(a,7);
}int main()
排序演算法之堆排序
前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...
排序演算法之堆排序
堆排序演算法是選擇排序的一種,該演算法只是通過堆,最大堆 或者最小堆選擇出乙個待排序序列中的最大值,或者最小值。要想實現堆排序演算法,就需要構建什麼堆,這裡也最小堆為例。說明什麼是堆,怎麼構建乙個堆。假設待排序序列為a n 為乙個陣列。陣列的長度為n 陣列下標為 0,1,2,i,2i,2i 1 n ...
排序演算法之堆排序
宣告 本博文 為樓主親自編寫並測試,其它內容引用至我一直很崇拜的牛人morewindows。他對排序演算法的講解通俗易懂,給人一種耳目一新的感覺。堆排序與快速排序 歸併排序 一樣都是時間複雜度為o n logn 的幾種常見排序方法。最小堆的講解以及最小堆元素的插入和刪除參見最小堆操作。以下繼續引用以...