堆排序Java实现

package practice;


import edu.princeton.cs.algs4.StdRandom;

public class TestMain {
    public static void main(String[] args) {
        int[] a = new int[20];
        for (int i = 0; i < a.length; i++) {
            int temp = (int)(StdRandom.random()*100);
            a[i] = temp;
        }
        HeapSrot.sort(a);
        for (int i = 1; i < a.length; i++) { //只能从a[1]开始排
            System.out.print(a[i]+" ");
        }
        System.out.println();
    }
}

class HeapSrot{
    public static void sort(int[] a) {
        int p = a.length;
        for (int k = p/2; k >= 1; k--) { //因为没有子元素的节点不用处理,所以只处理一半元素
            sink(a, k, p); //从下往上将所有(不包括没有子元素的节点),节点沉一遍,整个数组则堆有序
        } //为什么不像优先队列那样插入再上浮,因为这样可以快20%~30%
        while (p > 1) { //和优先队列弹出最大元素并删除操作一样,不是删除而是将最大元素移到末尾
            exch(a, 1, --p); //将第一个移到末尾
            sink(a, 1, p); //将换上来的沉下去
        }
    }
    /*
     * 下沉
     */
    private static void sink(int[] a,int k,int p) { //将元素与子元素比较,比子元素小则和两个中较大的那个换位置
        while ((2*k + 1) < p && ((a[k] < a[2*k + 1]) || (a[k] < a[2*k]))) {            
            if (a[2*k + 1] > a[2*k]) { exch(a, k, 2*k + 1); k = 2*k + 1; }
            else                     { exch(a, k, 2*k); k = 2*k; }
        }
    }
    /*
     * 交换
     */
    private static void exch (int[] a,int i, int j) {
        int t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
}

算法动画演示

http://www.cs.usfca.edu/~galles/visualization/HeapSort.html

posted @ 2017-07-27 18:00  zhangqi66  阅读(488)  评论(0编辑  收藏  举报