以下是实现的过程:因为是两个子类和父类进行比较和交换,保证每个树节点的左右子树都小于或者大于父类,以下是子类小于父类的实现方法。

因为是两子树和父节点比较,所以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);

        }
    }
最后修改:2019 年 09 月 03 日 10 : 36 AM