堆排序
2014-10-20 23:30
134 查看
思路:
使用数组存储,父节点与左右孩子节点的映射关系为
k为父节点,则左孩子为2k+1,右孩子为2k+2;
k为孩子节点,其父节点为(k-1)/2.
(1)、从最后一个非叶子节点开始倒序建立初始堆。
(2)、输出堆顶元素,把最后一个叶子节点放到堆顶,重新调整为堆。
(3)、重复(2)直到堆中没有元素。
reference
使用数组存储,父节点与左右孩子节点的映射关系为
k为父节点,则左孩子为2k+1,右孩子为2k+2;
k为孩子节点,其父节点为(k-1)/2.
(1)、从最后一个非叶子节点开始倒序建立初始堆。
(2)、输出堆顶元素,把最后一个叶子节点放到堆顶,重新调整为堆。
(3)、重复(2)直到堆中没有元素。
package Lesson1; public class MyHeap { // a为堆数据;n为有效数据个数;k为待筛选节点 static void heapAjust(int[] a, int n, int k) {// 对节点k进行筛选,往下落 int k1 = 2 * k + 1;// 左右孩子 int k2 = 2 * k + 2; if (k1 >= n && k2 >= n) {// 叶子节点不需调整 return; } int a1 = Integer.MAX_VALUE; int a2 = Integer.MAX_VALUE; if (k1 < n) { a1 = a[k1]; } if (k2 < n) { a2 = a[k2]; } if (a[k] <= a1 && a[k] <= a2) { return; } if (a1 < a2) { int t = a[k]; a[k] = a[k1]; a[k1] = t; heapAjust(a, n, k1); } else { int t = a[k]; a[k] = a[k2]; a[k2] = t; heapAjust(a, n, k2); } } static void heapSort(int[] a) { // 建立初始堆,从最后一个非叶子节点往上调整 for (int i = (a.length - 1) / 2; i >= 0; i--) { heapAjust(a, a.length, i); } int n = a.length;// 有效元素个数 while (n > 0) {// 输出 System.out.print(a[0] + " ");// 输出堆顶元素 a[0] = a[n - 1];// 把最后一个元素放到堆顶 n--; heapAjust(a, n, 0);// 调整堆顶元素 } System.out.println(); } public static void main(String[] args) { int[] a = { 12, 3, 6, 8, 5, 19, 20, 16, 4, 2, 7, 13, 9, 11 }; heapSort(a);// 堆排序 /* * for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } * System.out.println(); */ } }
reference
相关文章推荐