• 堆排序实现


    1、代码如下

    package better.amy.sort;
    
    /**
     * 堆排序实现
     * 
     * @author zhujinrong
     * 
     */
    public class HeapSort {
    
        /**
         * 构造大堆 大根堆排序的结果是升序
         * 
         * @param a
         *            数组a
         * @param m
         *            起始位置
         * @param n
         *            结束位置
         */
        private static void heapAdjustMax(int a[], int m, int n) {
    
            int t = a[m];
            for (int i = 2 * m + 1; i <= n; i = 2 * i + 1) {
                if (i < n && a[i + 1] > a[i]) {
                    i++;
                }
    
                if (t < a[i]) {
                    a[m] = a[i];
                    m = i;
                }
            }
    
            a[m] = t;
    
        }
    
        /**
         * 升序堆排序
         * 
         * @param a
         *            待排序数组
         */
        public static void heapSortAsc(int a[]) {
            if (a == null) {
                return;
            }
    
            int n = a.length;
            for (int i = n / 2 - 1; i >= 0; i--) {
                heapAdjustMax(a, i, n - 1);
            }
    
            for (int i = n - 1; i > 0; i--) {
                int t = a[i];
                a[i] = a[0];
                a[0] = t;
                heapAdjustMax(a, 0, i - 1);
            }
        }
    
        /**
         * 从下标m,到n,将其调整为小堆 小根堆排序结果是降序(或者说是非升序)
         * 
         * @param a
         *            待排序数组
         * @param m
         *            起始位置
         * @param n
         *            结束位置
         */
        public static void heapAdjustMin(int[] a, int m, int n) {
    
            int t = a[m];
            for (int i = 2 * m + 1; i <= n; i = 2 * i + 1) {
                if (i < n && a[i + 1] < a[i]) {
                    i++;
                }
    
                if (t > a[i]) {
                    a[m] = a[i];
                    m = i;
                }
            }
    
            a[m] = t;
        }
    
        /**
         * 降序堆排序
         * 
         * @param a
         *            待排序数组
         */
        public static void heapSortDesc(int a[]) {
            if (a == null) {
                return;
            }
    
            int n = a.length;
            for (int i = n / 2 - 1; i >= 0; i--) {
                heapAdjustMin(a, i, n - 1);
            }
    
            for (int i = n - 1; i > 0; i--) {
                int t = a[i];
                a[i] = a[0];
                a[0] = t;
                heapAdjustMin(a, 0, i - 1);
            }
        }
    }
    作者:BestNow
    出处:http://www.cnblogs.com/BestNow/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    LOJ#551 Matrix
    洛谷P5163 WD与地图
    洛谷P4831 Scarlet loves WenHuaKe
    LOJ#6118 鬼牌
    支配树
    线性插值
    PropertiesConfiguration
    ThreadLocal
    Thread
    FastJson
  • 原文地址:https://www.cnblogs.com/tianxue/p/4059138.html
Copyright © 2020-2023  润新知