堆排序

堆排序算法步骤

  1. 把无序数组构建成二叉堆。需要从小到大排序的,构建大根堆。需要从大到小的则构建小根堆。
  2. 循环删除堆顶元素,替换到二叉堆的末尾。调整产生新的堆顶。

过程示例

堆排序_第1张图片


性能

  • 稳定性:不稳定
  • 时间复杂度:O(nlogn)

代码实现

     * 下沉调整
     * @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 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--) {
            //最后1个元素和第1个元素进行交换
            int temp = array[i];
            array[i] = array[0];
            array[0] = temp;
            //下沉调整大根堆
            downAdjust(array, 0, i);
        }
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int[] arr = new int[] {1,3,2,6,5,7,8,9,10,0};
        heapSort(arr);
        System.out.println(Arrays.toString(arr));

你可能感兴趣的:(排序学习,java)