Browse Source

堆排序

ChenGanBin 6 years ago
parent
commit
85fa8d6102

+ 1 - 1
src/main/java/com/cyl/algorithrms/queue/MaxPQ.java

@@ -20,7 +20,7 @@ public class MaxPQ<Key extends Comparable<Key>> {
      */
     @SuppressWarnings("unchecked")
     public MaxPQ(int maxN){
-        pq = new Comparable<Key>[maxN + 1];
+        //pq = new Comparable<Key>[maxN + 1];
     }
 
     /**

+ 74 - 0
src/main/java/com/cyl/algorithrms/sort/HeapSort.java

@@ -0,0 +1,74 @@
+package com.cyl.algorithrms.sort;
+
+/**
+ * 堆排序
+ * @author cyl
+ */
+public class HeapSort {
+
+    public static void sort(Comparable[] a) {
+        int N = a.length;
+
+        for (int k = N/2; k >= 1; k--) {
+            sink(a, k, N);
+        }
+
+        while(N > 1) {
+            exch(a, 1, N--);
+            sink(a, 1, N);
+        }
+    }
+
+    /**
+     * 下沉
+     * @param k
+     */
+    private static void sink(Comparable[] a, int k, int n){
+        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(Comparable v, Comparable w) {
+        return v.compareTo(w) < 0;
+    }
+
+    private static void exch(Comparable[] a, int i, int j) {
+        Comparable t = a[i];
+        a[i] = a[j];
+        a[j] = t;
+    }
+
+    private static void show(Comparable[] a) {
+        //    在单行中打印数组
+        for (int i = 0; i < a.length; i++) {
+            System.out.print(a[i] + " ");
+        }
+        System.out.println();
+    }
+
+    public static boolean isSorted(Comparable[] a) {
+        //    测试数组元素是否有序
+        for (int i = 1; i < a.length; i++) {
+            if(less(a[i], a[i-1])) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static void main(String[] args) {
+        String[] a = "HEAPSORTEXAMPLE".split("");
+        sort(a);
+        assert isSorted(a);
+        show(a);
+    }
+}