堆排序

堆排序

package com.buaa.algorithm.sort;
/** * 堆排序 * @author lzxyzq * */
public class d3HeapSorted {
    //节点k进行筛选
    //a:堆数据,n:堆中有效数据个数,k待筛选节点
    static void heapOne(int[]a,int n,int k){
        int k1 = 2*k + 1;
        int k2 = 2*k + 2;
        if(k1>=n&&k2>=n)return;//已经是叶子了

        int a1 = Integer.MAX_VALUE;
        int a2 = Integer.MAX_VALUE;
        if(k1<n) a1 = a[k1];//左孩子值
        if(k2<n) a2 = a[k2];//右孩子值

        if(a[k]<=a1&&a[k]<=a2)return;//符合堆的要求

        //找到左右孩子中最小的,和它交换
        if(a1<a2){
            int t = a[k];
            a[k] = a[k1];
            a[k1] = t;
            heapOne(a,n,k1);
        }else{
            int t = a[k];
            a[k] = a[k2];
            a[k2] = t;
            heapOne(a,n,k2);
        }
    }

    static void heapSort(int[]a)
    {
    //建立初始堆
    for(int i=(a.length-1)/2;i>=0;i--)
        heapOne(a,a.length,i);    
    //边输出堆顶,边调整
    int n = a.length;//剩余元素数
    while(n>0){
        System.out.print(a[0]+" ");//输出堆顶元素
        a[0] = a[n-1];
        n--;
        heapOne(a,n,0);
    }
    System.out.println();
}    
    public static void main(String[] args) {
        int[]a = {12,3,6,8,5,19,20,16,4,2,7,13,9,11};
        heapSort(a);
    }
}

你可能感兴趣的:(堆排序)