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

    package com.ghj.util;
    
    public class sortAlgorithm<T extends Comparable<T>> {
    
        // 交换索引i和索引j的值
        private void swap(T[] data, int i, int j) {
            T tmp;
            tmp = data[i];
            data[i] = data[j];
            data[j] = tmp;
        }
    
        // -----堆排序 时间复杂度O(nlogn)-----
        public void heapSort(T[] data) {
            int arrayLength = data.length;
    
            // 循环建大顶堆
            for (int i = 0; i < arrayLength - 1; i++) {
                // 建堆
                builMindHeap(data, arrayLength - 1 - i);
                // 交换堆顶和最后一个元素
                swap(data, 0, arrayLength - 1 - i);
            }
        }
    
        // 对data数组从0到lastIndex建大顶堆
        private void builMaxdHeap(T[] data, int lastIndex) {
            // 从lastIndex处节点(最后一个节点)的父节点开始
            for (int i = (lastIndex - 1) / 2; i >= 0; i--) {
                // k 保存当前正在判断的节点
                int k = i;
                // 如果当前节点有子节点
                while (k * 2 + 1 <= lastIndex) {
                    // 当前节点的左子节点的索引
                    int biggerIndex = 2 * k + 1;
                    // 如果biggerIndex 小于lastIndex ,则biggerIndex + 1;
                    // 代表的k节点的右子节点存在
                    if (biggerIndex < lastIndex) {
                        // 如果右子节点的值比较大
                        if (data[biggerIndex].compareTo(data[biggerIndex + 1]) < 0) {
                            // biggerIndex总是记录较大的子节点的索引
                            biggerIndex++;
                        }
                    }
    
                    // 如果k节点的值小于其较大的子节点的值
                    if (data[k].compareTo(data[biggerIndex]) < 0) {
                        // 交换他们
                        swap(data, k, biggerIndex);
                        // 将biggerIndex赋给k,开始下一次循环
                        // 重新保证k节点的值大于其左右子节点的值
                        k = biggerIndex;
                    } else {
                        break;
                    }
                }
            }
        }
    
        // 对data数组从0到lastIndex建小顶堆
        private void builMindHeap(T[] data, int lastIndex) {
            // 从lastIndex处节点(最后一个节点)的父节点开始
            for (int i = (lastIndex - 1) / 2; i >= 0; i--) {
                // k 保存当前正在判断的节点
                int k = i;
                // 如果当前节点有子节点
                while (k * 2 + 1 <= lastIndex) {
                    // 当前节点的左子节点的索引
                    int minnerIndex = 2 * k + 1;
    
                    // 如果minnerIndex 大于 lastIndex ,则minnerIndex + 1;
                    // 代表的k节点的右子节点存在
                    if (minnerIndex < lastIndex) {
                        // 如果右子节点的值比较小
                        if (data[minnerIndex].compareTo(data[minnerIndex + 1]) > 0) {
                            // minnerIndex总是记录较小的子节点的索引
                            minnerIndex++;
                        }
                    }
    
                    // 如果k节点的值大于其较小的子节点的值
                    if (data[k].compareTo(data[minnerIndex]) > 0) {
                        // 交换他们
                        swap(data, k, minnerIndex);
                        // 将minnerIndex赋给k,开始下一次循环
                        // 重新保证k节点的值小于其左右子节点的值
                        k = minnerIndex;
                    } else {
                        break;
                    }
                }
            }
        }
    
        private static String getString(Comparable[] data) {
            String result = "";
            for (int i = 0; i < data.length; i++) {
                result = result + data[i].toString();
            }
            return result;
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            sortAlgorithm sort = new sortAlgorithm<>();
            Comparable[] data = { 1, 5, 2, 9, 3 };
            System.out.println("Before sort : " + getString(data));
            sort.heapSort(data);
            System.out.println("After sort : " + getString(data));
        }
    
    }
  • 相关阅读:
    在已经安装的nginx上,增加ssl模块
    apache ab压力测试报错(apr_socket_recv: Connection reset by peer (104))
    ab和jmeter进行GET/POST压力测试的使用心得和比较
    linux历史命令查找快捷方式
    HDFS的dfs.replication不同验证
    Set replication in Hadoop
    RVM 安装 Ruby
    Fluentd初探 简介与安装
    Flunetd 用于统一日志记录层的开源数据收集器
    Custom partition assignment and migration kafka集群扩充迁移指定partition
  • 原文地址:https://www.cnblogs.com/yunkong/p/4479499.html
Copyright © 2011-2022 走看看