堆排序就是對一個完全二叉樹進行排序,首先將數組構造成一個大頂堆(小頂堆也可以),大頂堆就是整個完全二叉樹的第一個元素最大,然後將首位進行換位,最後在將下次要構造的大頂堆的長度-1,直到最後只剩一個元素的時候就排序OK了 ,代碼如下:
class Program
{
static void Main(string[] args)
{
int[] arr = { 2, 3, 4, 1, 100, 44, 22 };
HeapSort(arr);
foreach (int a in arr) {
Console.WriteLine(a);
}
}
public static void HeapSort(int[] arr) {
if (arr.Length <= 1) return;
//先將完全二叉樹調整成大頂堆
HeapAdjustment(arr, arr.Length);
//每一次調整之後都將樹的第一個元素和最後一個元素交換並在下次排序中捨去最後一個元素
for (int i = arr.Length - 1; i > 0; i--) {
swapFirstAndLast(arr, i);
HeapAdjustment(arr, i);
}
}
//將完全二叉樹構造成大頂堆
public static void HeapAdjustment(int[] arr, int length)
{
for (int i = length / 2 - 1; i >= 0; i--) { //遍歷完全二叉樹的所有非葉子節點
for (int j = i * 2 + 1; j <= i * 2 + 2; j++)
{
int temp = 0; //臨時交換變量
if (j < length)
{
if (arr[i] < arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
}
//交換完全二叉樹的第一個元素和最後一個元素
public static void swapFirstAndLast(int[] arr, int last)
{
int temp = arr[0];
arr[0] = arr[last];
arr[last] = temp;
}
}