利用堆排序对一个记录进行升序
算法代码:
/* * 利用减治法求解堆排序 */ 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] + " "); } }