zoukankan      html  css  js  c++  java
  • 排序算法-堆排序(Java)

    package com.rao.linkList;
    
    import java.util.Arrays;
    
    /**
     * @author Srao
     * @className HeapSort
     * @date 2019/12/3 15:29
     * @package com.rao.linkList
     * @Description: 堆排序
     */
    public class HeapSort {
    
    
        /**
         * 在二叉堆当中,一般是删除根元素,在删除根元素之后,把最后一个元素当作根元素,然后进行下沉
         * @param arr
         * @param parent:被当作根元素的节点,从这个元素开始下沉
         * @param length:数组的长度
         * @return
         */
        public static int[] downAdjust(int[] arr, int parent, int length){
            //获取临时的根节点
            int temp = arr[parent];
    
            //计算左孩子节点
            int child = parent*2+1;
    
            //进行下沉操作
            while (child < length){
                //先对比左右孩子的大小,用小的那一个进行操作
                if (child+1 < length && arr[child+1] < arr[child]){
                    child++;
                }
                //如果父节点比子节点小,就直接退出
                if (temp <= arr[child]){
                    break;
                }else {//如果父节点比子节点大,就把子节点赋值给父节点
                    arr[parent] = arr[child];
                    //让父节点指针指向子节点
                    parent = child;
                    child = parent*2+1;
                }
            }
            arr[parent] = temp;
            return arr;
        }
    
    
    
        /**
         * 进行堆排序,因为二叉堆的顶部的数一定是最小的,
         * 所以把堆顶元素和堆的最后一个元素交换,然后重新构成一个二叉堆,
         * 每次都把最小的元素放在堆的最后
         * @param arr
         * @return
         */
        public static int[] sort(int[] arr, int length){
            //先构建一个二叉堆
            for (int i = (length-1)/2; i>=0; i--){
                downAdjust(arr, i, length);
            }
    
            //进行排序
            for (int i = length-1; i > 0; i--){
                //先把最小的元素放在堆的最后面,然后对堆的其它元素进行下沉
                int temp = arr[0];
                arr[0] = arr[i];
                arr[i] = temp;
    
                downAdjust(arr, 0, i);
            }
    
            return arr;
        }
    
        public static void main(String[] args) {
            int[] arr = new int[]{1, 3, 2, 6, 5, 0};
            System.out.println(Arrays.toString(arr));
            sort(arr, arr.length);
            System.out.println(Arrays.toString(arr));
        }
    }

    参照上一篇博客,里面又二叉堆构建的代码  https://www.cnblogs.com/rao11/p/11976960.html

    因为二叉堆的结构是堆顶元素最小,所以每次让堆顶元素和堆底元素进行交换,然后对除了最后一个元素以外的元素进行下沉操作,获得一个新的二叉堆

    每次进行下沉操作,数组中最小的元素都是堆顶元素,然后又与堆底元素进行交换,直到二叉堆只剩下一个元素,排序完成。

  • 相关阅读:
    带轮播图、导航栏、商品的简单html,以及轮播图下边数字随轮播图的改变而改变
    设计table表格,用js设计偶数行和奇数行显示不同的颜色
    用js实现九九乘法口诀两种方式
    [FW]修复ubutnu12.04+win7的grub2引导
    How to compile Linux kernel in fedora 6
    [Fw]初探linux中断系统(2)
    [Fw]初探linux中断系统(1)
    Regular Expression 範例
    [fw]IDT表的初始化
    [Fw]中断的初始化
  • 原文地址:https://www.cnblogs.com/rao11/p/11977195.html
Copyright © 2011-2022 走看看