堆排序

来源:互联网 发布:绿盟数据库审计系统 编辑:程序博客网 时间:2024/06/16 18:42

堆排序


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);    }}
0 0
原创粉丝点击