算法释义:堆排序算法的基本原理,其实就是利用二叉堆的数据结构,通过构建一个最大堆,然后将堆顶元素(最大值)与末尾元素交换,接着缩小堆的大小并重新调整堆,直到堆中只剩下一个元素。
C#实现堆排序大致包括以下两个步骤:
1、构建最大堆。从最后一个非叶子节点开始,向上逐个节点进行下沉操作,直到堆顶。
2、执行排序。将堆顶元素与堆的最后一个元素交换,然后缩小堆的范围,重新调整堆,直到堆中只剩下一个元素。
简单的示例代码如下:
cs
class Program
{
static void Main()
{
int[] arr = { 12, 11, 13, 5, 6, 7 };
int n = arr.Length;
HeapSort(arr, n);
// 打印排序后的数组
Console.WriteLine("Sorted array: ");
foreach (int item in arr)
{
Console.Write(item + " ");
}
}
// 堆排序函数
static void HeapSort(int[] arr, int n)
{
// 构建最大堆
for (int i = n / 2 - 1; i >= 0; i--)
Heapify(arr, n, i);
// 执行排序
for (int i = n - 1; i > 0; i--)
{
// 交换堆顶元素和当前堆的最后一个元素
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
// 重新调整堆
Heapify(arr, i, 0);
}
}
// 调整堆以确保堆的性质
static void Heapify(int[] arr, int n, int i)
{
int largest = i; // 假设当前节点是最大值节点
int left = 2 * i + 1; // 左子节点
int right = 2 * i + 2; // 右子节点
// 如果左子节点存在且大于当前节点
if (left < n && arr[left] > arr[largest])
largest = left;
// 如果右子节点存在且大于当前最大值节点
if (right < n && arr[right] > arr[largest])
largest = right;
// 如果最大值节点已经改变
if (largest != i)
{
// 交换当前节点和最大值节点
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
// 继续下沉
Heapify(arr, n, largest);
}
}
}