1. 程式人生 > >java實現的堆排序

java實現的堆排序

堆排序的演算法(主要使用的是二叉樹原理來實現): import java.util.Arrays;

public class HeapOperator { /** * 上浮調整 * @param array 待調整的堆 */ public static void upAdjust(int[] array) { int childIndex = array.length - 1; int parentIndex = (childIndex - 1)/2; //temp儲存插入的葉子節點值,用於最後賦值 int temp = array[childIndex]; while(childIndex > 0 && temp < array[parentIndex]){ array[childIndex] = array[parentIndex]; childIndex = parentIndex; parentIndex = (parentIndex - 1)/2; } array[childIndex] = temp; }

/**
 * 下沉調整
 * @param array  待調整的陣列
 * @param parentIndex   要下沉的父節點
 * @param length  堆得有效大小
 */
public static void downAdjust(int[] array, int parentIndex, int length)
{
	//temp用於儲存父節點的值,用於最後賦值
	int temp = array[parentIndex];
	int childIndex = 2 * parentIndex + 1;
	while (childIndex < length) {
		//如果有右孩子,並且右孩子小於左孩子的值,則定位到右孩子
		if((childIndex + 1) < length && array[childIndex + 1] < array[childIndex]){
			childIndex++;
		}
		//如果父節點小於任何一個孩子的值,則直接跳出
		if(temp < array[childIndex])
			break;
		//無需要真正的交換,單向賦值即可
		array[parentIndex] = array[childIndex];
		parentIndex = childIndex;
		childIndex = 2 * childIndex + 1;
	}
	array[parentIndex] = temp;
}
/**
 * 構建堆
 * @param array 待調整的堆
 */
public static void buildHeap(int[] array)
{
	//從最後一個非葉子節點開始,一次下沉調整
	for (int i = array.length/2; i >= 0 ; i--) {
		downAdjust(array, i, array.length - 1);
	}
}

public static void main(String[] args) {
	int[] array = new int[] {1,3,2,6,5,7,8,9,10,0};
	upAdjust(array);
	System.out.println(Arrays.toString(array));
	
	array = new int[]{7,1,3,10,5,2,8,9,6};
	buildHeap(array);
	System.out.println(Arrays.toString(array));
}

}