《基礎演算法之排序》 4 堆排序 java實現

2021-08-26 05:28:21 字數 1033 閱讀 9925

對於堆排序,首先要了解堆的概念,堆分為大頂堆和小頂堆。顧名思義,大頂堆的堆頂元素為整個堆的最大值;小頂堆的堆頂元素為整個堆的最小值。

對於本題的堆排序,採用的是大頂堆。堆排序主要分為兩部分,建堆和調整堆。

建堆的過程就是遍歷要排序的陣列中的每乙個元素,然後依次放入大頂堆,並比較大小,找到每個元素的位置,大頂堆構建完畢後,此時堆頂為最大值。

調整堆的過程就是,將堆頂的元素彈出堆,並將最後乙個元素放到堆頂,此時堆裡的元素減少了乙個,重新調整堆裡面的位置,保證堆頂為整個堆的最大值。

時間複雜度: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...