您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        这篇文章将为大家详细讲解有关Java中堆排序的案例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
优先队列可以用于以O(NlogN)时间排序。
对二叉堆不了解的可以看看图解优先队列(堆)
我们从数组下标0开始,不像二叉堆从数组下标1开始。
代码实现
public class Heapsort {
    public static void main(String[] args) {
        Integer[] integers = {7, 1, 13, 9, 11, 5, 8};
        System.out.println("原序列:" + Arrays.toString(integers));
        heapsort(integers);
        System.out.println("排序后:" + Arrays.toString(integers));
    }
    public static <T extends Comparable<? super T>> void heapsort(T[] a) {
        if (null == a || a.length == 0) {
            throw new RuntimeException("数组为null或长度为0");
        }
        //构建堆
        for (int i = a.length / 2 - 1; i >= 0; i--) {
            percDown(a, i, a.length);
        }
        //deleteMax
        for (int i = a.length - 1; i > 0; i--) {
            swapReferences(a, 0, i);
            percDown(a, 0, i);
        }
    }
    /**
     * 下滤的方法
     *
     * @param a:待排序数组
     * @param i:从哪个索引开始下滤
     * @param n           :二叉堆的逻辑大小
     * @param <T>
     */
    private static <T extends Comparable<? super T>> void percDown(T[] a, int i, int n) {
        int child;
        T tmp;
        for (tmp = a[i]; leftChild(i) < n; i = child) {
            child = leftChild(i);
            if (child != n - 1 && a[child].compareTo(a[child + 1]) < 0) {
                child++;
            }
            if (tmp.compareTo(a[child]) < 0) {
                a[i] = a[child];
            } else {
                break;
            }
        }
        a[i] = tmp;
    }
    private static int leftChild(int i) {
        return 2 * i + 1;
    }
    /**
     * 交换数组中两个位置的元素
     *
     * @param a:目标数组
     * @param index1 :第一个元素下标
     * @param index2 :第二个元素下标
     * @param <T>
     */
    private static <T> void swapReferences(T[] a, int index1, int index2) {
        T tmp = a[index1];
        a[index1] = a[index2];
        a[index2] = tmp;
    }
}
//输出结果
//原序列:[7, 1, 13, 9, 11, 5, 8]
//排序后:[1, 5, 7, 8, 9, 11, 13]时间复杂度:buildHeap使用O(N)的时间,元素下滤需要O(logN),需要下滤N-1次,所以总共需要O(N+(N-1)logN) = O(NlogN)。从过程可以看出,堆排序,不管最好,最坏时间复杂度都稳定在O(NlogN)。
空间复杂度:使用自身存储,无疑是O(1)。
关于Java中堆排序的案例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。