基本思想:对于给定的n个记录,初始时将这些记录看做一个顺序存储的二叉树,然后将其调整为一个大顶堆,再将堆的最后一个元素与堆顶元素进行交换,堆的最后一个元素即为最大记录,接着将堆的前(n-1)个元素重新调整为一个大顶堆,直到有序。
public static void adjustMinHeap(int []a,int pos,int len) {
int temp;
int child;
for(temp = a[pos];2 * pos + 1 <= len;pos = child){
//先找到父节点的左孩子
child = 2 * pos + 1;
//判断右孩子是否小于左孩子,小于的话当前节点为右孩子
if(child < len && a[child] > a[child + 1]){
child++;
}
//判断当前孩子节点小于父节点
if(a[child] < temp){
a[pos] = a[child];
}else{
break;
}
}
a[pos] = temp;
}
public static void myMinHeapSort(int [] a) {
int i;
int len = a.length;
//循环构建堆
for(i = len/2;i >=0;i--){
adjustMinHeap(a, i, len-1);
}
//交换堆顶元素和最后一个元素,继续调整前(n-1)个元素
for(i = len-1;i >= 0;i--){
int temp = a[0];
a[0] = a[i];
a[i] = temp;
adjustMinHeap(a, 0, i-1);
}
}