【Java】堆排序的Java实现

来源:互联网 发布:oppo软件开放平台 编辑:程序博客网 时间:2024/06/05 05:47

参考算法(第4版)

堆排序大致分两个部分:1、遍历所有父节点,完成堆的构造。

    2、遍历所有节点,下沉排序。

                                            注意点:堆用数组表示时,是从下标1开始的。

下面是代码部分:

package Algorithms;public class HeapSort {public static int[] a = { 0, 40, 2, 54, 25, 5, 123, 3, 0, 12, 5 };// a[0]不参与排序,因为二叉堆是从数组下标1开始的public static int N = a.length-1;//二叉堆的结点个数public static void main(String[] args) {sort(a);for(int i = 1;i < a.length;i++){System.out.print(a[i]+" ");}}// 堆排序public static void sort(int[] a) {// 堆的构造for (int k = N / 2; k >= 1; k--) {sink(k);}// 下沉排序while (N > 1) {exch(a, 1, N--);sink(1);}}// 由上而下的堆的有序化的实现private static void sink(int k) {while (2 * k <= N) {int j = 2 * k;if (j < N && less(j, j + 1)) {j++;}if (!less(k, j)) {break;}exch(a, k, j);k = j;}}// 比大小private static boolean less(int v, int w) {return a[v] < a[w];}// 交换数组的值private static void exch(int[] a, int i, int j) {int t = a[i];a[i] = a[j];a[j] = t;}}


0 0
原创粉丝点击