堆排序

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

算法步骤

1.把无序数组构建成二叉堆。需要从小到大排序则构建成最大堆;需要从大到小排队则构建成最小堆。

2.循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。

动图演示

2,7,26,25,19,17,1,90,3,36

12

代码实现

public class HeapSort {
    /**
     * ‘下沉’调整
     *
     * @param array       待调整的堆
     * @param parentIndex 要’下沉‘的父节点
     * @param length      堆的有效大小
     */
    public static void downAdjust(int[] array, int parentIndex, int length) {
        // 保存父节点的值,用于最后赋值
        int temp = array[parentIndex];
        int childIndex = 2 * parentIndex + 1;
        while (childIndex < length) {
            // 如果有右孩子,且右孩子大于左孩子的值,则定位到右孩子
            if (childIndex + 1 < length && array[childIndex + 1] > array[childIndex]) {
                childIndex++;
            }
            // 如果父节点大于任何一个孩子的值,则直接跳出
            if (temp >= array[childIndex]) {
                break;
            }
            // 赋值
            array[parentIndex] = array[childIndex];
            parentIndex = childIndex;
            childIndex = 2 * childIndex + 1;
        }
        array[parentIndex] = temp;
    }

    /**
     * 堆排序
     *
     * @param array 待调整的堆
     */
    public static void heapSort(int[] array) {
        // 把无序数组构建成最大堆
        for (int i = (array.length - 2) / 2; i >= 0; i--) {
            downAdjust(array, i, array.length);
        }
        System.out.println(Arrays.toString(array));
        // 循环删除堆顶元素,移到集合尾部,调整堆产生新的堆顶
        for (int i = array.length - 1; i > 0; i--) {
            int temp = array[i];
            array[i] = array[0];
            array[0] = temp;
            downAdjust(array, 0, i);
        }
    }

    public static void main(String[] args) {
        int[] array = new int[]{2, 7, 26, 25, 19, 17, 1, 90, 3, 36};
        heapSort(array);
        System.out.println(Arrays.toString(array));
    }
}

thirtyyy
16 声望0 粉丝

生活如水,时而浑浊,时而清澈