//堆元素存储在数组中 ,用最大堆排序,数组从0开始存储
public class HeapSort {
public void sort(int[] a){
//构建最大堆
for(int i = a.length/2 ; i >= 0 ; i--){
processDown(a, i, a.length);
}
//把根节点与数组末尾节点互换,即把最大节点存到末尾,同时用末尾节点放在根节点处,然后开始从根节点重新构建最大堆
for(int j = a.length - 1 ; j > 0 ; j--){
int tmp = a[0];
a[0] = a[j];
a[j] = tmp;
processDown(a, 0,j);
}
}
//有n个元素的堆 ,从i处开始向下构建最大堆
private void processDown(int[] a, int i , int n){
int child , tmp ;
for(tmp = a[i] ; leftChild(i) < n ; i = child){
child = leftChild(i);
if(child != n - 1 && a[child] < a[child+1])
child++;
if(tmp < a[child])
a[i] = a[child];
else
break;
}
a[i] = tmp;
}
//返回节点i的左孩子
private int leftChild(int i){
return 2*i + 1;
}
}
堆排序 java实现
最新推荐文章于 2024-02-18 17:31:59 发布