堆排序重建堆的時間複雜度 堆排序及其時間複雜度

2021-10-17 06:43:36 字數 681 閱讀 9480

堆排序

//這裡構建陣列過程只是做乙個簡單的示例,複雜情況暫不考慮

//接受鍵盤輸入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 ...

堆排序時間複雜度 堆排序演算法

堆排序是指利用堆積樹這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆是乙個優先順序佇列,對於大頂堆而言,堆頂元素的權值最大。將待排序的數組建堆,然後不斷地刪除堆頂元素,就實現了排序。堆排序基本思想 將待排序序列構造成乙個大頂堆,此時,整個序列的最大...