堆排序
//這裡構建陣列過程只是做乙個簡單的示例,複雜情況暫不考慮
//接受鍵盤輸入n個數,構建陣列
int *setuparr()
int n;
scanf("%d",&n);
int *arr = (int *)malloc(sizeof(int)*n);
if(arr)
for(int i = 0; i < n; i++)
scanf("%d",&arr[i]);
return arr;
return null;
//建堆的過程是從最後乙個非葉子節點開始調整
int initheap(int *arr) / (1-q);
s = 2^k -k -1;
又因為k為完全二叉樹的深度,所以
(2^k) <= n < (2^k -1 )
總之可以認為:k = logn (實際計算得到應該是 log(n+1) < k <= logn );
綜上所述得到:s = n - longn -1,所以時間複雜度為:o(n)
推算過程:
logn(n-1) = nlogn - logn ;
綜上所述:建堆的時間複雜度是o(n)(呼叫一次);調整堆的時間複雜度是lgn,呼叫了n-1次,所以堆排序的時間複雜度是o(n)+o(nlgn) ~ o(nlgn)。
堆排序時間複雜度 堆排序
科班出身的程式設計師就應該研究些演算法和資料結構類的東西,不然,有什麼優勢?堆排序,結構是完全二叉樹,選擇排序的一種,其流程控制和氣泡排序類似,每次選出乙個最大 或最小的元素 排出去,然後下一輪再選出乙個最大 最小的 以此類推,直到剩下乙個不能構成二叉樹為止也排出去,排出來的就是有序的了。只不過每次...
堆排序建堆的時間複雜度
建堆的過程,看起來外面一層迴圈o n 裡面是個logn的調整函式,時間複雜度貌似是nlogn的,但是仔細分析,其實質是o n 的。證明如下 首先,對於高度為h的完全二叉樹,其第i層的元素個數為2 i 1 對於堆的每一層,調整的深度都不一樣,每層的元素的調整深度小於等於h i,假設每層調整的深度是h ...
堆排序時間複雜度 堆排序演算法
堆排序是指利用堆積樹這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆是乙個優先順序佇列,對於大頂堆而言,堆頂元素的權值最大。將待排序的數組建堆,然後不斷地刪除堆頂元素,就實現了排序。堆排序基本思想 將待排序序列構造成乙個大頂堆,此時,整個序列的最大...