堆
堆是一个顺序结构的完全二叉树
堆排序
先构造大顶堆,把尾元素与顶交换,然后把尾索引减一,在构造大顶堆,交换,减一,构造,循环。
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;
}
}
}
}
}
}

本文介绍了如何用C#编程语言实现大顶堆的构造过程,并详细展示了大顶堆排序的算法步骤。通过`HeapSout`方法建立大顶堆,然后进行元素交换和调整,实现排序。代码中包含了`HeapAdjust`函数,用于调整堆结构以保持大顶堆特性。
2759

被折叠的 条评论
为什么被折叠?



