堆排序简单示例

/**
 * 堆排序 维基百科
 * */
public class HeapSorts {

	private static int[] sort = {144,233,55,66,1235,85,4,79};
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		buildMaxHeap(sort);
		heapSort(sort);
		for(int i : sort){
			System.out.println(i);
		}
	}
	private static void heapSort(int[] data){
		for(int i = data.length -1; i >0 ;i--){
			//交换 将堆顶的值和最后一个元素交换
			int temp = data[i];
			data[i] = data[0];
			data[0] = temp;
			//交换完 从 堆顶就开始不稳定了 因此要从第一个元素开始重新建
			maxHeap(data,i,0);
		}
	}
	
	private static void buildMaxHeap(int[] data){
		int startIndex = getParaentIndex(data.length -1);
		//建堆
		for(int i = startIndex ;i >=0 ;i--){
			maxHeap(data,data.length,i);
		}
	}
	
	/**
	 * @param index 建堆的位置
	 * @param heapSize 
	 * */
	 private static void maxHeap(int[]data ,int heapSize ,int index){
		 int left = getLeftChildIndex(index);
		 int right = getRightChildIndex(index);
		 int largest = index ;//用来记录根  左右孩子的最大值
		 //创建的是大根堆
		 if(left < heapSize && data[index] < data[left]){
			 largest = left;
		 }
		 if(right < heapSize && data[largest] < data[right]){
			 largest = right;
		 }
		 //如果最大值不是根节点 需要交换
		 if(largest != index){
			 int temp = data[index];
			 data[index] = data[largest];
			 data[largest] = temp ;
			 //交换后可能破坏子堆的稳定性 因此要重新建堆 largest 记录了交换的位置
			 maxHeap(data,heapSize,largest);
		 }
	 }
	//获取父节点
	private static int getParaentIndex(int current){
		return (current - 1) >> 1 ;
	}
	//获取左孩子节点
	private static int getLeftChildIndex(int current){
		return (current << 1) + 1;
	}
	//获取右孩子节点
	private static int getRightChildIndex(int current){
		return (current << 1) + 2;
	}
	
}

你可能感兴趣的:(java)