堆排序
1.建堆
2.排序
3.调整
public class HeapSort{
public void buildHeap(int [] a){
for (int i=(a.length-2)/2;i>=0;i--){//从叶子节点开始建堆,使得每一颗子树都是大根堆
adjust(a,i,a.length);
}
}
//调整使得大的元素在上层
private void adjust(int[] a, int i, int i1) {
int temp=a[i];//保存当前的根节点元素
for (int k=i*2+1;k<i1;k=k*2+1){//如果根节点没有子节点就返回,否则找到两个根节点中较大的元素,
//将根节点和大元素交换,并将子节点作为新的根节点,调整该节点使其成为大根堆
if (k+1<i1&&a[k]<a[k+1])k++;
if (temp>=a[k])break;
else{
a[i]=a[k];
i=k;
}
}
//调整完毕则最后一个调整的节点继承最开始根节点的值
a[i]=temp;
}
public void sort(int []a){
buildHeap(a);//建立大根堆
for (int i=a.length-1;i>0;i--){
int temp=a[0];//将根元素和末尾元素交换,相当于出队
a[0]=a[i];
a[i]=temp;
adjust(a,0,i);//最大元素出队后重新建堆
}
}
public static void main(String[] args) {
int a[]={0,1,2,3,4,5,6,7,8,9 };
HeapSort hs=new HeapSort();
hs.sort(a);
for (int i=a.length-1;i>=0;i--
) {
System.out.print(a[i]+" ");
}
}
}