1.堆排序java实现

public class HeapSort {

	/**
	 * 调整aaray[parent,end]范围为最大堆
	 * @param array
	 * @param parent
	 * @param end
	 */
	public static void heapAdjust(int[] array,int parent,int end){
		int left = parent*2+1;//左节点
		int temp = array[parent];
	
		while(left<=end){
			if(left+1<=end && array[left+1]>array[left])
				left=left+1;
			if(temp<array[left]){
				array[parent]=array[left];
			}else{
				//已经是最大堆,其子树必然是最大推,因为是从下往上调整的
				break;
			}
			//如果发生了交换的话,要继续调整下面的推,维持下面的堆仍旧是最大堆
			parent=left;
			left=left*2+1;
		}
		array[parent]=temp;	//确定根结点在当前堆的位置	
	}
	
	public static void heapSort(int[] array){
		//创建初始堆
		for(int i=array.length/2-1;i>=0;i--){
			//从最后一个非叶子结点开始调整堆,从下往上逐步形成最大堆
			heapAdjust(array, i, array.length-1);
		}
		int temp=0;
		for(int i=array.length-1;i>0;i--){
			//与最后一个互换
			temp = array[i];
			array[i]=array[0];
			array[0]=temp;
			//调整堆,此时堆的调整范围为[0,i-1]
			heapAdjust(array, 0, i-1);
		}
	}
	
	public static void main(String[] args) {
		int[] array = new int [10];
		for(int i=0;i<10;i++){
			array[i]=(int)(Math.random()*10);
		}
		System.out.println(Arrays.toString(array));
		heapSort(array);
		System.out.println(Arrays.toString(array));
	}
}

猜你喜欢

转载自blog.csdn.net/cl723401/article/details/88100835