排序演算法 七 堆排序

2021-08-08 09:28:35 字數 1193 閱讀 2475

1.1 什麼是堆

要理解堆排序,首先要先理解什麼是堆。堆是一顆順序儲存的完全二叉樹,堆又分為最大堆和最小堆。

根據上面的描述我們可以用乙個數學描述來定義最大最小堆:

對於陣列[d(0), d(1), …., d(n)]當且僅當滿足下列關係時稱之為堆

舉個栗子:[3, 4, 7, 12, 15, 18]就是乙個典型的最小堆, i <= 2。

1.2 堆排序

理解了堆的概念之後,堆排序就是利用最大堆和最小堆的特性進行排序

將陣列初始化成最大堆

交換最大堆的第乙個和最後乙個數字,輸出最後乙個數字(最大值)

將破壞後的最大堆重新調整為最大堆

接著重複2~3步直到交換堆的第一和第二個節點,此時結束排序

此演算法的關鍵在於如何構建最大堆。根據上訴最大最小堆的定義,可以寫出針對某一parent的調整演算法。

public

void

adjustmaxheap(int data, int parent, int length)

//如果父節點的值大於子節點的值,則跳出迴圈

if (temp >= data[child])

//把孩子節點的值賦給父節點

data[parent] = data[child];

//選取子節點的左子節點,繼續向下調整

parent = child;

child = 2 * child + 1;

}data[parent] = temp;

}

此函式為調整某個parent的值,初始化的時候需要從n/2開始一直迴圈調整到0;

for (int i = data.length / 2; i >= 0; i--)
完整對堆排序演算法如下:

@override

public

int sort(int data)

for (int i = data.length / 2; i >= 0; i--)

for (int i = data.length - 1; i > 0; i--)

return data;

}

完整實現可檢視:

github/heapsort

堆排序是一種不穩定的排序演算法。平均,最壞和最好的時間複雜度都是o(nlogn)。

排序七 堆排序

時間複雜度 最好 o n o n 平均o n o nlogn 最差o n o nlogn 空間複雜度 o n o 1 穩定性 不穩定 堆 順序儲存的完全二叉樹,其每個結點均小於等於或大於等於其子節點。小根堆 每個結點元素的值都小於等於其子節點元素的值的堆。s i s 2 i 1 s i s 2 i ...

排序演算法之七 堆排序 Heap Sort

堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。將待排序的元素序列 r1,r2 rn 構建成最大堆,此堆為初始的無序區。關於最大堆的詳細構建過程請點這裡 將最大堆的堆頂元...

基本排序演算法 之七 堆排序

首先放遞迴的版本,因為遞迴版本更容易理解過程。堆排序實際是把數列看成一顆完全二叉樹,而不是真的去用 指標結構體 構造一顆二叉樹。數列在堆中從上到下,從左至右依次排成一棵樹。下面是遞迴版本的 用來調整節點,保證節點大於左右孩子 templatevoid adjustnode t arr,int nod...