以下是实现的过程:因为是两个子类和父类进行比较和交换,保证每个树节点的左右子树都小于或者大于父类,以下是子类小于父类的实现方法。
因为是两子树和父节点比较,所以N深度的树, 从0到N-1的话,从(N-1)/2不断往回排序就可以,不用从最下面一层开始,而是从父类开始就可以。
HeapSort方法的原理是每一次把最大的数堆到了根节点,然后把最大的和最后一个交换,接着从倒数第二个找第二大的数
创建堆
public void CreateHeap(int[] arr,int low,int high)
{
if (low >= high||high>arr.Length-1)
return;
int j =0;
int temp = 0;
int k = 0;
//从倒数第二行开始往上排,保证子节点都小于父节点
for(int i =high/2;i>=low;i--)
{
k = i;
j = 2 * k + 1;//左节点
temp = arr[i];
while (j <= high)
{
if (j < high && (j + 1 <= high)&&(arr[j]<arr[j+1]))//如果左节点小于右节点,j+1
{
j++;
}
if (temp < arr[j])//和父节点比较,把大的往上堆
{
arr[k] = arr[j];
k = j;
j = 2 * k + 1;
//如果父节点比子节点小的话,有可能比子节点的子节点还小往下递归
}
else
{
j = high + 1;//不交换的话就不用往下递归,退出while
}
}
arr[k] = temp;
//从上往下交换,停止的时候上面交换的那个小的,就是位置k的位置,因为k可能不断变化和父节点不断交换,或者没交换
}
}
排序
public void HeapSort(int[] arr)
{
int temp = 0;
CreateHeap(arr,0,arr.Length-1);
//不断把大的往上推,堆完放到后面,不断从后面往前排序
for (int i=arr.Length-1; i>0;i--)
{
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
CreateHeap(arr,0,i-1);
}
}