public class Main { public static void main(String[] args) { int a[] = {8, 2, 5, 6, 4, 8, 9, 7, 14, 2, 3, 6, 4}; a = heapSort(a); for (int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); } //构建大根堆 private static int[] buildMaxHeap(int[] a) { //从最后一个节点a.length-1的父节点(array.length-1-1)/2开始,直到根节点0,反复调整堆 int half = (a.length - 2) / 2; for (int i = half; i >= 0; i--) { adjustDownToUp(a, i, a.length); } return a; } //将元素array[k]自下往上逐步调整树形结构 private static void adjustDownToUp(int[] a, int k, int length) { int temp = a[k]; for (int i = 2 * k + 1; i < length - 1; i = 2 * i + 1) { //i为初始化为节点k的左孩子,沿节点较大的子节点向下调整 if (i < length && a[i] < a[i + 1]) { //取节点较大的子节点的下标 i++; //如果节点的右孩子>左孩子,则取右孩子节点的下标 } if (temp >= a[i]) { //根节点 >=左右子女中关键字较大者,调整结束 break; } else { //根节点 <左右子女中关键字较大者 a[k] = a[i]; //将左右子结点中较大值array[i]调整到双亲节点上 k = i; //修改k值,以便继续向下调整 } } a[k] = temp; //被调整的结点的值放入最终位置 } //堆排序 public static int[] heapSort(int[] array) { array = buildMaxHeap(array); //初始建堆,array[0]为第一趟值最大的元素 for (int i = array.length - 1; i > 1; i--) { swap(array, 0, i);//将堆顶元素和堆低元素交换,即得到当前最大元素正确的排序位置 adjustDownToUp(array, 0, i); //整理,将剩余的元素整理成堆 } return array; } //交换 public static void swap(int a[], int i, int j) { a[i] = a[i] + a[j]; a[j] = a[i] - a[j]; a[i] = a[i] - a[j]; } }
直接上代码,从代码中细细品味,分析。
思路:1、构建大堆或小堆 2、交换、调整