Java数据结构——堆排序实现

package 排序;

public class 堆排序 {
	public static void main(String[] args) {
		int[] array = {3,1,5,7,2,4,9,6,10,8};
		System.out.println("数组初始值:");
		print(array,10);
		heapSort(array,10);
		System.out.println("数组转化后的结果:");
		print(array, 10);
	}

	/**
	 * 堆排序算法
	 * @param array	
	 * @param i		
	 */
	private static void heapSort(int[] array, int i) {
		//修建初始堆
		buildingHeap(array,10);
		//从最后一个元素开始对序列进行调整
		for (int j = i-1;j>0;--j) {
			//交换堆顶元素array[0]和堆中最后一个元素
			int temp = array[j];
			array[j] = array[0];
			array[0] = temp;
			//每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整
			heapAdjust(array, 0, j);
		}
	}

	/**
	 * 讲array数组建成堆
	 * 调整完之后的第一个元素是序列最小的元素
	 * @param array
	 * @param i
	 */
	private static void buildingHeap(int[] array, int i) {
		System.out.println("修建初始堆:");
		for (int j = (i-1)/2; j >= 0; --j) {
			heapAdjust(array,j,i);
		}
		System.out.println("结束修建!!!!!!!!!");
	}

	/**
	 * 修建新的堆
	 * @param array	待调整的堆数组
	 * @param j		待调整的数组元素的位置
	 * @param i		i是数组的长度
	 */
	private static void heapAdjust(int[] array, int j, int length) {
		int temp = array[j];
		int child = 2*j + 1;//左孩子结点的位置。(i+1 为当前调整结点的右孩子结点的位置) 
		 
		while (child<length) {
			// 如果右孩子存在并且右孩子大于左孩子(找到比当前待调整结点大的孩子结点)  
			if (child+1 < length && array[child]<array[child+1]) {
				++child;
			}
			if (array[j]<array[child]) { // 如果较大的子结点大于父结点  
				array[j] = array[child]; // 那么把较大的子结点往上移动,替换它的父结点  
				j = child;				 // 重新设置s ,即待调整的下一个结点的位置  
				child = 2*j +1;
			} else {					 // 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出
				break;
			}
			array[j] = temp;
		}
		System.out.println("调整:");
		print(array, length);
	}

	private static void print(int[] array, int i) {
		for (int j = 0; j < i; j++) {
			System.out.print(" " + array[j]);
			 
		}
		System.out.println();
	}
}

你可能感兴趣的:(数据结构,堆排序,java数据结构,java堆排序)