堆排序

来源:互联网 发布:win7仿linux主题 编辑:程序博客网 时间:2024/04/30 02:07

思路:

使用数组存储,父节点与左右孩子节点的映射关系为

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

0 0