记录下堆排序。。。。
堆排序的步骤:
1)根据给定的数组建立堆结构,维护堆的性质;
2)排序:每次将堆顶与最后一个元素(不算堆顶互换过来的)互换,再维护 第一个元素至最后一个元素 的堆性质,重新维护堆。。。依此循环
import java.util.Arrays;
public class HeapMakeTest {
public static void main(String[] args) {
int[] num = {1,2,5,3,9,7,4,8};
HeapMakeTest hmt = new HeapMakeTest();
hmt.makeHeap(num,num.length);
System.out.println(Arrays.toString(num));
hmt.heapSort(num, num.length);
System.out.println(Arrays.toString(num));
}
// 建立一个大顶堆,从最后一个元素的双亲节点开始
public void makeHeap(int[] num,int length){
for(int i=(length-1-1)/2;i>=0;i--)
adjustHeap(num,i,length);
}
public void adjustHeap(int[] num, int k, int length){
int temp = num[k]; // 记录父节点的值
for(int i=2*k+1;i<length;i=2*i+1){ // i=2*i+1 不断的往孩子节点方向调整,因为父节点与孩子节点交换后,孩子树中可能不满足堆的性质
if(i+1<length && num[i]<num[i+1])
i++; // 找到左、右孩子节点中的最大值
if(temp>=num[i])
break; // 如果父节点大于孩子节点,不需要调整
else{
num[k]=num[i]; // 孩子节点赋值给父节点
k = i; // 记录需要更新的节点位置
}
}
num[k]=temp; // 更新上述k下标节点的值
}
// 堆排序
public void heapSort(int[] num,int length){
// 数组首部与数组尾部交换,即堆的顶挪到“相对”最后一位,(不算来自堆顶的元素),再将其余的数组元素重建堆,依此循环
for(int i=0;i<length;i++){
int tmp = num[0];
num[0]=num[length-1-i];
num[length-1-i]=tmp;
makeHeap(num,length-1-i);
}
}
}