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

    前言:

      堆性质定义

      大根堆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;
        }

     


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

  • 相关阅读:
    Hive创建表格报Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException的错误
    Hive本地模式安装及遇到的问题和解决方案
    CentOS6 编译安装Mysql5.6.26
    数据结构全攻略--学好数据结构的必经之路
    JAVA项目打开出现红色感叹号!
    前端语言html
    1 利用Anaconda完美解决Python 2与python 3的共存问题
    0 Windows上安装Anaconda和python的教程详解
    回溯算法
    建立结构体
  • 原文地址:https://www.cnblogs.com/misscai/p/15438847.html
Copyright © 2011-2022 走看看