堆排序
2014-09-11 23:44
113 查看
/** * 堆排序 * * @param a * */ public static void heapSort(int[] a) { for (int i = (a.length - 2) / 2; i >= 0; i--) { // 从最后一个非叶子节点开始初始化堆 adjustHeap(a, a.length, i); } int[] tmp = new int[a.length]; for (int i = 0; i < a.length; i++) { // 输出堆 tmp[i] = a[0]; swap(a, 0, a.length - 1 - i); // 最后一个节点交换到第一个节点 adjustHeap(a, a.length - i - 1, 0); // 调整堆,同时堆的大小减小了 } System.arraycopy(tmp, 0, a, 0, a.length); } private static void adjustHeap(int[] a, int n, int k) { // 调整堆 int k1 = k * 2 + 1; int k2 = k * 2 + 2; if (k2 < n) { if (a[k] > a[k2]) { swap(a, k, k2); adjustHeap(a, n, k2); } } if (k1 < n) { if (a[k] > a[k1]) { swap(a, k, k1); adjustHeap(a, n, k1); } } else { return; } }