1: 怎样形成一个大根堆呢?
/* * heapInsert 将新进来的节点 更新到原来的大堆中。 * index 节点大于她的父节点 就往上交换, 可能 一直到最大堆的根。 */ public static void heapInsert(int[] arr, int index){ while( arr[index] > arr[(index-1)/2]){ swap(arr, index, (index-1)/2); index = (index-1)/2; } }
2:当大根堆中某个节点的值变小了,怎么办?
/* * 当最大堆中的某个节点变小了,需要和他的左右孩子比较, 有需要的话要往下沉。 */ public static void heapify(int[] arr, int index, int heapsize){ int left = index*2 + 1; while( left < heapsize ){ int largest = left +1 < heapsize && arr[left+1] > arr[left] ? left+1:left; largest = arr[index] > arr[largest] ? index:largest; if( largest == index ) break; swap(arr, largest, index); index = largest; left = index*2+1; } }
3:堆排序的过程是怎么样的?
public static void heapSort(int[] arr){ for( int i=0; i<arr.length; ++i) HeapSort.heapInsert(arr, i); int heapsize = arr.length; while( heapsize > 0 ){ swap(arr, 0, --heapsize); heapify(arr, 0, heapsize); } }