利用堆排序对一个记录进行升序
算法代码:
/*
* 利用减治法求解堆排序
*/
public class TestTwo {
/**
* 用于维护堆,保持最大堆的性质
* @param a 数组a
* @param k 要筛的结点
*/
public static void MaxHeapify(int[] a,int k,int n){
int i,j,temp;
i = k; j = 2*i +1; //置i为要筛的结点,j为i的左孩子
while(j<n) {
//其中j<n-1可以用于判断i是否有右孩子。后面的用于比较左右孩子的大小
if(j<n-1 && a[j] < a[j+1])
j++;
if(a[i]>a[j]) //i节点大于左右孩子中的最大者
break;
else {
temp = a[i];
a[i] = a[j];
a[j] = temp;
i = j;
j = 2*i+1;
}
}
}
public static void HeapSort(int[] a) {
int n = a.length;
//这里须知,每建立一次堆,只能确定根节点是最大值,其他节点并没有按序拍好,
//所以后面有重复建堆的过程,但是需要建堆的区间慢慢变少了
for(int i = (n-1)/2; i>=0;i--) //初始建堆,其中 一开始i表示的是最后一个元素的父节点
MaxHeapify(a, i,a.length);
for(int i=1;i<=n-1;i++) //重复执行移走堆项及重建堆的操作
{
int temp = a[0];
a[0] = a[n-i];
a[n-i] = temp;
MaxHeapify(a, 0,a.length - i); //只要调整根节点,0...a.length-i是无序区
}
}
public static void main(String[] args) {
int[] a = {27,17,3,16,13,10,1,5,7,12,4,8,9,0};
HeapSort(a);
for(int j = 0;j<a.length;j++)
System.out.print(a[j] + " ");
}
}