• Java-堆排序


    public class Main {
    
        public static void main(String[] args) {
            int a[] = {8, 2, 5, 6, 4, 8, 9, 7, 14, 2, 3, 6, 4};
            a = heapSort(a);
            for (int i=0;i<a.length;i++){
                System.out.print(a[i]+" ");
            }
            System.out.println();
        }
    
        //构建大根堆
        private static int[] buildMaxHeap(int[] a) {
            //从最后一个节点a.length-1的父节点(array.length-1-1)/2开始,直到根节点0,反复调整堆
            int half = (a.length - 2) / 2;
            for (int i = half; i >= 0; i--) {
                adjustDownToUp(a, i, a.length);
            }
            return a;
        }
    
        //将元素array[k]自下往上逐步调整树形结构
        private static void adjustDownToUp(int[] a, int k, int length) {
            int temp = a[k];
            for (int i = 2 * k + 1; i < length - 1; i = 2 * i + 1) {    //i为初始化为节点k的左孩子,沿节点较大的子节点向下调整
                if (i < length && a[i] < a[i + 1]) {  //取节点较大的子节点的下标
                    i++;   //如果节点的右孩子>左孩子,则取右孩子节点的下标
                }
                if (temp >= a[i]) {  //根节点 >=左右子女中关键字较大者,调整结束
                    break;
                } else {   //根节点 <左右子女中关键字较大者
                    a[k] = a[i];  //将左右子结点中较大值array[i]调整到双亲节点上
                    k = i; //修改k值,以便继续向下调整
                }
            }
            a[k] = temp;  //被调整的结点的值放入最终位置
        }
        //堆排序
        public static int[] heapSort(int[] array) {
            array = buildMaxHeap(array); //初始建堆,array[0]为第一趟值最大的元素
            for (int i = array.length - 1; i > 1; i--) {
                swap(array, 0, i);//将堆顶元素和堆低元素交换,即得到当前最大元素正确的排序位置
                adjustDownToUp(array, 0, i);  //整理,将剩余的元素整理成堆
            }
            return array;
        }
    
        //交换
        public static void swap(int a[], int i, int j) {
            a[i] = a[i] + a[j];
            a[j] = a[i] - a[j];
            a[i] = a[i] - a[j];
        }
    }


    直接上代码,从代码中细细品味,分析。

    思路:1、构建大堆或小堆 2、交换、调整




  • 相关阅读:
    LVM 扩容硬盘笔记
    jupyter notebook 远程访问
    samba 配置文件详解
    linux 网络挂载 windows 共享文件夹
    cmder 与 win10 wsl ( 当前目录打开wsl)
    vscode for latex
    Python 使用代理
    Python Signal(信号) 异步系统事件
    centos7 install magento
    lua笔记
  • 原文地址:https://www.cnblogs.com/pilihaotian/p/8822930.html
Copyright © 2020-2023  润新知