對於堆排序,首先要了解堆的概念,堆分為大頂堆和小頂堆。顧名思義,大頂堆的堆頂元素為整個堆的最大值;小頂堆的堆頂元素為整個堆的最小值。
對於本題的堆排序,採用的是大頂堆。堆排序主要分為兩部分,建堆和調整堆。
建堆的過程就是遍歷要排序的陣列中的每乙個元素,然後依次放入大頂堆,並比較大小,找到每個元素的位置,大頂堆構建完畢後,此時堆頂為最大值。
調整堆的過程就是,將堆頂的元素彈出堆,並將最後乙個元素放到堆頂,此時堆裡的元素減少了乙個,重新調整堆裡面的位置,保證堆頂為整個堆的最大值。
時間複雜度:o(n*logn)
空間複雜度:o(1)
由於堆排序調整堆時,堆底元素要先變為堆頂元素,然後在調整堆,會發生位置的變化,因此,堆排序為非穩定性排序。
public
static
int heapsort(int arr)
for (int i = 0; i < arr.length; i++)
int size = arr.length;
swap(arr,0, --size); //堆底元素與最後一位交換
while (size > 0)
return arr;
}private
static
void heapinsert(int arr, int
index) else }}
private
static
void heapify(int arr, int
index, int size)
if (right < size && arr[right] > arr[largest])
if (largest != index)else
index = largest;
left = index * 2 + 1;
right = index * 2 + 2;}}
public
static
void swap(int arr, int i, int j)
排序演算法4 堆排序
基本思想 大堆對應公升序序列,小堆對應降序佇列,我們從最後乙個非葉子結點建堆,步驟如下 將堆頂元素與當前最大堆的最後乙個節點交換 最大堆節點 1,即調整剩下的n 1個節點 從堆頂繼續向下調整,試之滿足最大堆,迴圈 和 直至剩下乙個節點。時間複雜度 nlogn 穩 定 性 不穩定 適用場景 topk等...
演算法4 堆排序
1.堆排序基本思想 利用堆 最大堆,最小堆 進行排序,特殊的樹形資料結構 完全二叉樹 將乙個無序序列構造成乙個堆。輸出堆頂元素後,調整剩餘元素稱為乙個新堆。2.複雜度 堆排序的主要執行時間耗費在初始構建堆和重建堆時的反覆篩選上。構建堆的時間複雜度為o n 重建堆的時間複雜度為o nlogn 堆排序對...
排序 4 堆排序
將待排序的序列構成乙個大頂堆。此時,序列的最大值就是堆頂的根結點。將它移走 就是,將其與堆陣列的末尾元素交換,此時末尾的元素就是最大值 然後將剩餘的n 1個序列重新構成乙個堆,如此反覆。其中關鍵問題 1 如何將無序序列構成乙個堆 2 輸出堆頂元素後,如何調整公升序元素為乙個堆 4.堆排序 堆調整 v...