使用减治法求解堆排序

利用堆排序对一个记录进行升序

算法代码:

	/*
	 * 利用减治法求解堆排序
	 */
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] + " ");
	}

}

猜你喜欢

转载自blog.csdn.net/hjl_heart/article/details/80024865