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 classminhead
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...