只贴出代码参考,原理百度有很多讲解
大顶堆
public class LargeHeap { public static void sort(Comparable[] a){ for (int i = a.length/2-1; i >=0 ; i--) { adjustHeap(a,i,a.length-1); } 建堆后 a[0]为最大值 for (int i = a.length-1; i >0;i--) { //每次将堆顶和最后一个元素交换 exch(a,0,i); //算法平均性能 nlogn //依次建堆n是for循环一层 logn 每次调整大顶堆 a[0]下沉 每次只比较交换 <logn adjustHeap(a,0,i-1); } } /* * 每次将数组lo...hi调整为大顶堆 * * */ public static void adjustHeap(Comparable[] a,int lo,int hi){ Comparable val=a[lo]; //此处代码不难立即自己手动画图验证即可 for (int i = lo*2+1; i <=hi ; i*=2) { if(i<hi&&less(a[i],a[i+1])) i++; if(!(less(val,a[i]))) break; a[lo]=a[i];lo=i; } a[lo]=val; } private static boolean less(Comparable v,Comparable w){ return v.compareTo(w)<0; } private static void exch(Comparable[] a,int i,int j){ Comparable t=a[i];a[i]=a[j];a[j]=t; } public static boolean isSorted(Comparable[] a){ for (int i = 0; i <a.length ; i++) { if(less(a[i],a[i])) return false; } return true; } public static void main(String[] args){ Comparable a[]={5,643,-1,53,4,1,2,97,88,9,0}; sort(a); for (int i = 0; i < a.length; i++) { System.out.println(a[i]); } } }
小顶堆
public class LittleHeap { public static void sort(Comparable[] a){ for (int i = a.length/2-1; i >=0 ; i--) { adjustHeap(a,i,a.length-1); } for (int i = a.length-1; i >0; i--) { exch(a,0,i); adjustHeap(a,0,i-1); } } /* * 每次将数组lo...hi调整为小顶堆 用到的方法是 堆的上浮算法 * * */ public static void adjustHeap(Comparable[] a,int lo,int hi){ Comparable val=a[lo]; for (int i = lo*2+1; i <=hi ; i*=2) { ------------------------------这段代码是不同的------------------------- --------------------------------------------------------------------- /*检查边界 i=hi-1时候保证i+1 存在 */ if(i<hi&&less(a[i+1],a[i])) i++; /*如果不经过上一步就直接和当前节点子节点比对(此时只有一个节点)*/ if(less(a[i],val)){ a[lo]=a[i];lo=i; }else break; -------------------------------------------------------------------------- } a[lo]=val; } private static boolean less(Comparable v,Comparable w){ return v.compareTo(w)<0; } private static void exch(Comparable[] a,int i,int j){ Comparable t=a[i];a[i]=a[j];a[j]=t; } public static boolean isSorted(Comparable[] a){ for (int i = 0; i <a.length ; i++) { if(less(a[i],a[i])) return false; } return true; } public static void main(String[] args){ Comparable a[]={5,643,53,4,1,2,97,88,9,0}; sort(a); for (int i = a.length-1; i >=0; i--) { System.out.println(a[i]); } } }