首页 > 编程语言 > 详细

堆排序

时间:2019-03-03 14:30:22      阅读:272      评论:0      收藏:0      [点我收藏+]

堆排序,①先将数组n转换成大顶堆(从第一个非叶子结点从下至上,从右至左调整结构,至将最大元素调整到根节点) 

    ②再将根节点与最后的节点m交换(此时的最后节点为剩下的未排序的最后一个节点,已排序的排除)

    ③交换后,继续对0至m-1的数据进行调整(即对剩下的数据进行重复②、③操作)

父节点为i,则左孩子为:2*i+1,右孩子为:2*i+2

 

 

public static void heapSort(int []arr){

        //1.构建大顶堆

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

            //从第一个非叶子结点从下至上,从右至左调整结构

            adjustHeap(arr,i,arr.length);

        }

        //2.调整堆结构+交换堆顶元素与末尾元素

        for(int j=arr.length-1;j>0;j--){

            swap(arr,0,j);//将堆顶元素与末尾元素进行交换

            adjustHeap(arr,0,j);//重新对堆进行调整

        }

 

    }

 

    /**

     * 调整大顶堆(仅是调整过程,建立在大顶堆已构建的基础上)

     * @param arr

     * @param i

     * @param length

     */

    public static void adjustHeap(int []arr,int i,int length){

        int temp = arr[i];//先取出当前元素i

        for(int k=i*2+1;k<length;k=k*2+1){//从i结点的左子结点开始,也就是2i+1处开始

            if(k+1<length && arr[k]<arr[k+1]){//如果左子结点小于右子结点,k指向右子结点

                k++;

            }

            if(arr[k] >temp){//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)

                arr[i] = arr[k];

                i = k;

            }else{

                break;

            }

        }

        arr[i] = temp;//将temp值放到最终的位置

    }

 

    /**

     * 交换元素

     * @param arr

     * @param a

     * @param b

     */

    public static void swap(int []arr,int a ,int b){

        int temp=arr[a];

        arr[a] = arr[b];

        arr[b] = temp;

    }

堆排序

原文:https://www.cnblogs.com/hj-lxp/p/10464989.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!