算法释义:堆排序算法的基本原理,其实就是利用二叉堆的数据结构,通过构建一个最大堆,然后将堆顶元素(最大值)与末尾元素交换,接着缩小堆的大小并重新调整堆,直到堆中只剩下一个元素。
C#实现堆排序大致包括以下两个步骤:
1、构建最大堆。从最后一个非叶子节点开始,向上逐个节点进行下沉操作,直到堆顶。
2、执行排序。将堆顶元素与堆的最后一个元素交换,然后缩小堆的范围,重新调整堆,直到堆中只剩下一个元素。
简单的示例代码如下:
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);}}
}