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