/// 小根堆排序
private static void HeapSort(ref double[] array)
{
for (int i = array.Length - 1; i >= 0; i--)
{
if (2 * i + 1 < array.Length)
{
int minChild = 2 * i + 1;
// 比較左右子節點,取較小者
if (2 * i + 2 < array.Length && array[2 * i + 1] > array[2 * i + 2])
minChild = 2 * i + 2;
if (array[i] > array[minChild])
{
ExchangeValue(ref array[i], ref array[minChild]);
NodeSort(ref array, minChild);
}
}
}
}
/// 節點下沉調整
private static void NodeSort(ref double[] array, int startIndex)
{
while (2 * startIndex + 1 < array.Length)
{
int minChild = 2 * startIndex + 1;
if (2 * startIndex + 2 < array.Length &&
array[2 * startIndex + 1] > array[2 * startIndex + 2])
minChild = 2 * startIndex + 2;
if (array[startIndex] > array[minChild])
{
ExchangeValue(ref array[startIndex], ref array[minChild]);
startIndex = minChild;
}
else break;
}
}
private static void ExchangeValue(ref double a, ref double b)
{
double temp = a; a = b; b = temp;
}
| 指標 | 複雜度 |
|---|---|
| 時間 (最好/平均/最差) | O(n log n) |
| 空間 | O(1) 原地排序 |
| 穩定性 | 不穩定 |
「演算法是程式的靈魂」。雖 C#/Java 提供豐富內建排序 (
Array.Sort、List.Sort、LINQOrderBy),理解底層演算法原理對於:
- 效能調優與複雜度分析
- 自訂比較器 (
IComparer) 正確實作- 面試與電腦科學基礎鞏固
- 特殊場景 (外部排序、平行排序) 選型
皆至關重要。建議定期複習經典演算法,避免「靈魂出竅」。
完整控制台程式碼包含本系列 6 種排序實作,可下載參考。