堆是一个顺序结构的完全二叉树
堆排序 先构造大顶堆,把尾元素与顶交换,然后把尾索引减一,在构造大顶堆,交换,减一,构造,循环。
namespace 堆 { class Program { static void Main(string[] args) { int[] data = new int[] { 50, 10, 90, 30, 70, 40, 80, 60, 20 }; HeapSout(data); foreach (int item in data) { System.Console.Write(item+" "); } System.Console.ReadKey(); } /// <summary> /// 构造大顶堆 /// </summary> /// <param name="data"></param> static void HeapSout(int []data) { HeapAdjust(data, data.Length); ///大顶堆排序 for (int i=data.Length; i>1; i--) { int endNum = i; int temp = data[endNum - 1]; data[endNum - 1] = data[0]; data[0] = temp; HeapAdjust(data, i-1); } } /// <summary> /// 构造大顶堆 /// </summary> /// <param name="data"></param> /// <param name="headNum"></param> /// <param name="rearNum"></param> static void HeapAdjust(int []data,int rearNum) { for (int i = rearNum/2; i >= 1; i--) { int maxNum = i; int tempNum = i; while (true) { int leftChild = tempNum * 2; int rightChild = tempNum * 2 + 1; if (leftChild <= rearNum && data[leftChild - 1] > data[maxNum - 1])//第一个条件判断左右节点是否存在 { maxNum = leftChild; } if (rightChild <= rearNum && data[rightChild - 1] > data[maxNum - 1]) { maxNum = rightChild; } if (maxNum != tempNum) { int temp = data[tempNum - 1]; data[tempNum - 1] = data[maxNum - 1]; data[maxNum - 1] = temp; tempNum = maxNum; } else { break; } } } } } }