zoukankan      html  css  js  c++  java
  • 算法学习——堆排序(二叉树排序)

    堆排序是利用二叉树的原理进行排序,所以又称之为二叉树排序。树中任意一非叶节点的关键字均不大于或不小于其左右孩子节点的关键字。
    堆排序原理:利用最大堆或是最小堆特点,先将数组生成一个最大堆或最小堆的二叉树,再将关键字的堆顶与无序区的最后一个节点进行位置互换。多次循环,保证其节点都比其孩子节点的数值大或者小。
    代买实现:
    public class Test{
        public static void main(String[] args){
            int[] arr = {1,5,3,4,8,2,6,7};

            for(int i = arr.length/2 - 1; i > 0; i--){                    //对数组进行建堆操作,就是从最后一个非叶结点进行筛选的过程 
                paixu(arr,i,arr.length-1);
            }

            for(int i = arr.length-1; i > 0; i--){                        //将该大顶堆 的堆顶与堆尾互换位置
                int temp = arr[0];
                arr[0] = arr[i];
                arr[i] = temp;
                paixu(arr,0,i-1);
            }

            for(int i:arr){                                                        //遍历输出数组
                Sysout.print(i+"  ");
            }
        }

        public static void paixu(int[] arr, int i, int len){
            int temp = arr[i];                                                //i为最后的一个非叶子结点  即有子结点的结点
            for(int j = 2*i; j < len; j *=2){
                if(i < len && arr[j] < arr[j+1]){
                    ++j;                                                            //值较大的数组小标
                }
                if(temp >= arr[j]){
                    breack;
                }
                arr[i] = arr[j];                                                    //将此值 上移到父节点
                i=j;
            }
            arr[i] = temp;                                                        //要放入的位置
        }

  • 相关阅读:
    【WP开发】记录屏幕操作
    【.NET深呼吸】清理对象引用,有一个问题容易被忽略
    【WP开发】JSON数据的读与写
    【WP8.1开发】RenderTargetBitmap类的特殊用途
    【WP 8.1开发】How to 图像处理
    【WP8.1开发】用手机来控制电脑的多媒体播放
    【WP 8.1开发】如何动态生成Gif动画
    【WP8.1开发】基于应用的联系人存储
    使用awk处理文本
    PHP数组和字符串的处理函数汇总
  • 原文地址:https://www.cnblogs.com/shuaiyongyong/p/7374677.html
Copyright © 2011-2022 走看看