Java-堆排序

public class Main {

    public static void main(String[] args) {
        int a[] = {8, 2, 5, 6, 4, 8, 9, 7, 14, 2, 3, 6, 4};
        a = heapSort(a);
        for (int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        System.out.println();
    }

    //构建大根堆
    private static int[] buildMaxHeap(int[] a) {
        //从最后一个节点a.length-1的父节点(array.length-1-1)/2开始,直到根节点0,反复调整堆
        int half = (a.length - 2) / 2;
        for (int i = half; i >= 0; i--) {
            adjustDownToUp(a, i, a.length);
        }
        return a;
    }

    //将元素array[k]自下往上逐步调整树形结构
    private static void adjustDownToUp(int[] a, int k, int length) {
        int temp = a[k];
        for (int i = 2 * k + 1; i < length - 1; i = 2 * i + 1) {    //i为初始化为节点k的左孩子,沿节点较大的子节点向下调整
            if (i < length && a[i] < a[i + 1]) {  //取节点较大的子节点的下标
                i++;   //如果节点的右孩子>左孩子,则取右孩子节点的下标
            }
            if (temp >= a[i]) {  //根节点 >=左右子女中关键字较大者,调整结束
                break;
            } else {   //根节点 <左右子女中关键字较大者
                a[k] = a[i];  //将左右子结点中较大值array[i]调整到双亲节点上
                k = i; //修改k值,以便继续向下调整
            }
        }
        a[k] = temp;  //被调整的结点的值放入最终位置
    }
    //堆排序
    public static int[] heapSort(int[] array) {
        array = buildMaxHeap(array); //初始建堆,array[0]为第一趟值最大的元素
        for (int i = array.length - 1; i > 1; i--) {
            swap(array, 0, i);//将堆顶元素和堆低元素交换,即得到当前最大元素正确的排序位置
            adjustDownToUp(array, 0, i);  //整理,将剩余的元素整理成堆
        }
        return array;
    }

    //交换
    public static void swap(int a[], int i, int j) {
        a[i] = a[i] + a[j];
        a[j] = a[i] - a[j];
        a[i] = a[i] - a[j];
    }
}


直接上代码,从代码中细细品味,分析。

思路:1、构建大堆或小堆 2、交换、调整




posted @ 2017-08-27 16:03  浩月白雪  阅读(119)  评论(0编辑  收藏  举报