zoukankan      html  css  js  c++  java
  • 堆排序

    /*
    堆是一棵完全二叉树,底层可以用数组实现,若根节点的index是0,那么若一个节点的index是i,它的父节点的index就是(i-1)/2,
    左右子节点的index是i*2+1和i*2+2。
    若是升序排列,就存储为最大堆,即任意节点都要比它的子节点要大。降序则存储为最小堆。
    步骤:
    1.构建最大堆,构建最大堆和每次调整最大堆都是把数组中最大元素调整到树顶
    2.顶元素和最后元素交换,相当于把顶元素排除
    3.调用adjust函数调整堆以还原为最大堆(此时不考虑已经排除的元素),重复步骤2,3直到结束
    
    构建最大堆:
    从最后一个非叶子节点(下标从0开始的情况下index是(n-2)/2)开始调用adjust函数,从下往上调整
    
     */
    
    public class Main {
    
        public static void main(String[] args) {
            int[] data = new int[]{2,8,4,3,1,6,9,7,10,-2,65};
            Main main = new Main();
            main.heapSort(data);
            for (int i = 0; i < data.length; i++) {
                System.out.println(data[i]);
            }
        }
        //堆排序主函数
        public void heapSort(int[] data)
        {
            if (data == null || data.length <= 1)
                return;
            //记录当前heap的size
            int heapSize = data.length;
            //1.构建最大堆函数
            //从最后一个非叶子节点开始
            int index = (heapSize-2)/2;
            for (int i = index; i >=0 ; i--) {
                adjust(i,heapSize,data);
            }
            //2.交换最后元素和顶元素(相当于取出顶元素(最大)到最后)
            while (heapSize > 1)
            {
                change(0,heapSize-1,data);
                heapSize--;
                //3.调整堆
                adjust(0,heapSize,data);
            }
    
    
        }
    
        //调整最大堆函数
        public void adjust(int index,int heapSize,int[] data){
            //左右子节点的index
            int left = index*2+1;
            int right = index*2+2;
            //记录此次比较的三个节点中最大的节点的index
            int biggest = index;
            //判断左子节点是否存在且是否比当前最大值大
            if (left < heapSize && data[left] > data[biggest])
            {
                biggest = left;
            }
            //判断右子节点是否存在且是否比当前最大值大,注意这里都是和biggest,不是index.因为是找出最大值,出错过一次
            if (right < heapSize && data[right] > data[biggest])
            {
                biggest = right;
            }
            //判断最大值的index是否还是当前节点index,不是的话:交换,递归,是的话(本来就是最大或者这是个叶节点)就会返回
            if (biggest != index)
            {
                change(index,biggest,data);
                adjust(biggest,heapSize,data);
            }
        }
        //交换函数
        public void change(int index1,int index2,int[] data)
        {
            int temp = data[index1];
            data[index1] = data[index2];
            data[index2] = temp;
        }
    }
  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/stAr-1/p/7569706.html
Copyright © 2011-2022 走看看