堆排序

前言:

  堆性质定义

  大根堆arr(i)>arr(2*i+1) && arr(i)>arr(2*i+2)

  小根堆arr(i)<arr(2*i+1) && arr(i)<arr(2*i+2)

 

堆排序基本思想:

  1.首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端

  2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1

  3.将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组

 


 (一)代码

    private static void sort(int[] array) {

        int len = array.length;
        //构建大根堆
        buildMaxHeap(array,len);
        for(int i = len - 1 ; i > 0 ; i--){
            //因为上面已经构建好了大根堆
            //0 的位置就是最大的值,将最大值与最后一位交换,
            //再将剩余的数,重新构建大根堆
            swap(array,0,i);
            len--;
            //剩余的数重新构建大根堆
            heapify(array,0,len);
        }


    }

    private static void buildMaxHeap(int[] array,int len) {

        //注意此处i >= 0
        for(int i = (int)Math.floor(len / 2); i >= 0 ;i--){
            heapify(array,i,len);
        }

    }

    private static void heapify(int[] array, int i, int len) {

        //
        int left = 2 * i + 1;
        //
        int right = 2 * i + 2;
        //
        int root = i;

        //如果左边的节点 大于 根节点 就把左边的下标 赋给根
        if(left < len && array[left] > array[root]){
            root = left;
        }
        //如果右边的节点 大于 根节点 就把右边的下标 赋给根
        if(right < len && array[right] > array[root]){
            root = right;
        }

        //交换根节点 与 左子 或  右子
        if(root != i){
            //交换
            swap(array,i,root);
            //递归执行
            heapify(array,root,len);
        }

    }

    public static void swap(int[] array,int i , int j){
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

 

 

 


 

 

 

      每天没干什么,就感觉好累

 

posted @ 2021-10-22 14:46  朝才  阅读(110)  评论(0编辑  收藏  举报