java實現的堆排序
阿新 • • 發佈:2018-12-11
堆排序的演算法(主要使用的是二叉樹原理來實現): 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)); }
}