Day577.堆排序 -数据结构和算法Java

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day577.堆排序 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。

堆排序

一、介绍


二、基本思想


三、图解分析





四、代码实现

package com.achang.tree;

import java.util.Arrays;

/**
 * 堆排序(升序排列:采用大顶堆方案)
 */
public class HeapSort 
    public static void main(String[] args) 
        int[] arr = 4, 6, 8, 5, 9;
        heapSort(arr);
    


    /**
     * 堆排序方法
     *
     * @param arr 待排序的数组
     */
    public static void heapSort(int[] arr) 
//        adjustHeap(arr,1, arr.length);
//        System.out.println("第一次调整:"+ Arrays.toString(arr));//4,9,8,5,6
//        adjustHeap(arr,0,arr.length);
//        System.out.println("第一次调整:"+ Arrays.toString(arr));//9,6,8,5,4

        int temp = 0;
        for (int i = arr.length / 2 - 1; i >= 0; i--) 
            adjustHeap(arr, i, arr.length);
        

        for (int i = arr.length - 1; i > 0; i--) 
            //交换
            temp = arr[i];
            arr[i] = arr[0];
            arr[0] = temp;
            adjustHeap(arr, 0, i);
        

        System.out.println(Arrays.toString(arr));
    

    /**
     * 大顶堆的构造:将数组调整成一个大顶堆
     *
     * @param arr    待转换的数组
     * @param i      表示非叶子节点在数组中的索引位置
     * @param length 对多少个元素进行调整,length在逐渐的减少
     */
    public static void adjustHeap(int[] arr, int i, int length) 
        int temp = arr[i];//取出当前元素的值
        /**
         * j = i * 2 + 1 中的 j 为 i节点的左子节点
         */
        for (int j = i * 2 + 1; j < length; j = j * 2 + 1) 
            if (j + 1 < length && arr[j] < arr[j + 1]) //左子节点的值 小于 右子节点的值
                j++;//j 指向右子节点
            
            if (arr[j] > temp) //如果子节点 大于 父节点temp
                arr[i] = arr[j];//把较大的值赋给当前的节点
                i = j;// i指向j,继续循环比较
             else 
                break;
            
        
        //当for循环结束后,此时以i为父节点的树的最大值,已经放到了最顶上(局部的)

        arr[i] = temp;//将temp的值放到调整后的位置
    


以上是关于Day577.堆排序 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章

FJ省队集训DAY1 T1

启动时签名的驱动程序给出错误577

堆(利用堆进行数组排序)-堆排序

排序--08---堆排序

053-577

e577. Enabling Antialiasing