adjust_max_heap:
功能:算法核心、调整3元堆结构
操作:每次比较第i个元素的子节点与i的大小关系,若i不是最大则调整i与最大元素,并在调整的位置(假设为j)继续该比较。直到不需要调整为止。
build_max_heap:功能:建立初始堆
操作:从最后一个非叶子节点开始,从后往前调用adjust_max_heap。
heap_sort:
功能:利用大根堆实现排序
操作:每次取出大根堆的根节点,交换到数组最后。调用adjust_max_heap调整新堆为大根堆。直到所有元素排序完成。
public class heapSort {
public static void main(String[] args) {
int []L={4,5,6,3,7,8};
heap_sort(L);
for(int i=0;i<L.length;i++){
System.out.println(L[i]);
}
}
public static void heap_sort(int[] L){
build_max_heap(L);
int i=L.length;
while(i>0){
int temp=L[i-1];
L[i-1]=L[0];
L[0]=temp;
i--;
adjust_max_heap(L, i, 0);
}
}
public static void build_max_heap(int[] L){
int length=L.length;
for(int i=(length-1)/2;i>=0;i--){
adjust_max_heap(L,length,i);
}
}
public static void adjust_max_heap(int[] L,int length,int i){
int largest=i;
while(true){
int left=2*i+1,right=2*i+2;
if(left<length&&L[left]>L[i]){
largest=left;
}else{
largest=i;
}
if(right<length&&L[right]>L[largest]){
largest=right;
}
if(largest!=i){
int temp=L[i];
L[i]=L[largest];
L[largest]=temp;
i=largest;
continue;
}else{
break;
}
}
}
}