将优先队列变成一种排序方法
用下沉操作由N个元素构造堆只需要少于2N次比较以及少于N次交换
将N个元素排序,只需要少于(2NlgN+2N)次比较(以及一半次数的交换)
private static void sink(Comparable[] a,int k,int n) {
while(2*k<n){
int j=2*k;
if (j<n&&a[j+1].compareTo(a[j])<0) j++;
if (a[j].compareTo(a[k])<=0) break;
exch(a,k,j);
k=j;
}
}
public static void exch(Comparable[] a,int i,int j) {
Comparable t=a[i];a[i]=a[j];a[j]=t;
}
public static void sort(Comparable[] a) {
int N=a.length;
//构造堆
for (int k = N/2; k >=1; k--) {
sink(a,k,N);
}
//while循环将最大的元素a[1]和a[N]交换并且修复了堆
while (N>1) {
exch(a, 1, N--);
sink(a, 1, N);
}
}