本文目錄一覽:
c語言 堆排序算法升序排列N個數
#include cstdio
int arr[120000];
int main()
{
int T,n;
scanf(“%d”,T);
while (T–)
{
scanf(“%d”,n);
for (int i =1 ; i = n ; i ++)
scanf(“%d”,arr[i]);
sort(arr+1,arr+n+1);
for (int i = 1; i = n ; i ++)
printf(“%d%c”,arr[i],i==n?’\n’:’ ‘;
}
return 0;
}
C語言堆排序 幾個不明白的地方。高手幫忙啊!~
這裡為什麼是i=n/2-1,初學者可能會不明白。
你這樣考慮。
首先對於葉子節點,我們沒有必要進行維護操作,也就是沒有必要調用你的HeapAdjust
函數
為什麼呢?因為葉子節點沒有孩子。就算調用了,也不起作用。
所以你應該從n/2-1下標所對應的節點開始,一直維護到0下標對於的節點。
n/2-1是編號最大的非葉子節點,而0號節點是根節點
至於這裡為什麼是–i,因為這裡是自低向上的維護,最後一個維護的必然是根節點。
實際上這兩句話的作用是建堆。
for(i=n/2-1;i=0;–i)
HeapAdjust(data,i,n-1);
我畫了個草圖
C語言堆排序最壞的情況下比較次數最多要多少次?
O(n1og2n)在最壞情況下,冒泡排序所需要的比較次數為n(n-1)//2;簡單插入排序所需要的比較次數為n(n-1)/2;希爾排序所需要盼的比較次數為0(n1.5);堆排序所需要的比較次數為0(nlog2n)。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/236541.html