演算法4 堆排序

2021-08-17 19:49:19 字數 1809 閱讀 5557

1.堆排序基本思想

利用堆(最大堆,最小堆)進行排序,特殊的樹形資料結構(完全二叉樹)

①將乙個無序序列構造成乙個堆。

②輸出堆頂元素後,調整剩餘元素稱為乙個新堆。

2.複雜度

堆排序的主要執行時間耗費在初始構建堆和重建堆時的反覆篩選上。構建堆的時間複雜度為o(n),重建堆的時間複雜度為o(nlogn), 堆排序對原始記錄的狀態不敏感,所以最好,最壞,平均情況的時間複雜度都為o(nlogn)。

空間複雜度,有乙個交換的暫存單元,記錄的比較和交換是跳躍式進行的,所以堆排序不穩定。

堆排序初始構建堆所需的比較次數比較多,並不適合元素較少的情況。

3.步驟

①構建最大堆,最小堆

②堆頂元素和最後元素交換,除最後元素的堆重新構建。

③堆頂元素和倒數第二元素交換,再重新構建,依次迴圈。

4.**詳解

最大堆

public class 

maxhead

return

array;}

//調整陣列

public void

adjust

(int

array

, int i,

int

length

) if

(temp

>=

array[j

]) else

}array[i

]=temp;//

被調整的節點放入最終位置}//

堆排序public int

headsort

(int

array)//

判斷剩餘兩個元素if(

array[0

]>

array[1

])return

array;}

//main

public static void

main

(string

args

);mh

.headsort(a

);for

(int i=

0;ilength;i

++)}

最小堆

public class 

minhead

return

array;}

//建立時調整,和 修改時調整

public void

adjust

(int

array

, int i,

int

length

) if

(temp

<=

array[j

])else

}array[i

]=temp;}

//排序

public int

headsort

(int

array)//

剩餘最後兩個元素要比較if(

array[0

]<

array[1

])return

array;}

////main

public static void

main

(string

args

);mh

.headsort(a

);for

(int i=

0;ilength;i

++)}

}

排序演算法4 堆排序

基本思想 大堆對應公升序序列,小堆對應降序佇列,我們從最後乙個非葉子結點建堆,步驟如下 將堆頂元素與當前最大堆的最後乙個節點交換 最大堆節點 1,即調整剩下的n 1個節點 從堆頂繼續向下調整,試之滿足最大堆,迴圈 和 直至剩下乙個節點。時間複雜度 nlogn 穩 定 性 不穩定 適用場景 topk等...

排序 4 堆排序

將待排序的序列構成乙個大頂堆。此時,序列的最大值就是堆頂的根結點。將它移走 就是,將其與堆陣列的末尾元素交換,此時末尾的元素就是最大值 然後將剩餘的n 1個序列重新構成乙個堆,如此反覆。其中關鍵問題 1 如何將無序序列構成乙個堆 2 輸出堆頂元素後,如何調整公升序元素為乙個堆 4.堆排序 堆調整 v...

排序(4) 堆排序

堆排序 把堆頂元素不斷的和末尾元素互換,互換後使得末尾元素為n 1,再從堆頂元素往下濾,使之保持堆的性質即可。includeusing namespace std typedef struct heap heap void percolatedown heap h,int hole heap bui...