堆排序

package sort.choose;

import java.util.Arrays;

/**
 * @author chenyi
 * @Description 二叉树遍历
 * @date 2022/2/17 15:30
 */
public class HeapSort {

    public static void main(String[] args) {
        //int arr[] = {4,6,8,5,9};
        int arr[] = {10, 6, 14, 4, 8, 12, 16, -1, 1, 99};
        System.out.println("遍历顺序存储二叉树");
        System.out.println(Arrays.toString(arr));
        /*System.out.println("第一次堆排序");
        adjustHeap(arr,arr.length/2-1,arr.length);
        System.out.println(Arrays.toString(arr));
        System.out.println("第二次堆排序");
        adjustHeap(arr,1,arr.length);
        System.out.println(Arrays.toString(arr));
        System.out.println("第三次堆排序");
        adjustHeap(arr,0,arr.length);
        System.out.println(Arrays.toString(arr));*/
        System.out.println("堆排序");
        for (int i = (arr.length >> 1) - 1; i >= 0; i--) {
            adjustHeap(arr, i, arr.length);
        }

        for (int i = arr.length - 1; i > 0; i--) {
            // 把最大的数放到末尾
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            adjustHeap(arr, 0, i);
        }
        System.out.println(Arrays.toString(arr));

    }

    private static void adjustHeap(int[] arr, int i, int length) {
        // 记录i的值
        int temp = arr[i];
        int max = i;
        // 至少要有一个左节点吧
        while (max * 2 < length - 1) {
            // 比较树的左右节点
            if (arr[2 * i + 1] > arr[max]) {
                max = 2 * i + 1;
            }
            if (2 * i + 2 < length && arr[2 * i + 2] > arr[max]) {
                max = 2 * i + 2;
            }
            if (max == i) {
                break;
            }
            // 交换之后要考虑是否会影响子树,所以要对变更的节点进行再次调整
            arr[i] = arr[max];
            arr[max] = temp;
            i = max;
        }
    }


}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容