小结几种基本排序算法:选择、插入、希尔、快排、归并、堆排序。
0.各算法都用到的父类:
package algs; import java.util.Arrays; /** * Author: areful * Date: 2018/8/9 */ public abstract class BaseSort { protected static Comparable<Character>[] data() { return new Comparable[]{'A', 'r', 'e', 'f', 'u', 'l', '1', '9', '9', '7' }; } protected static boolean less(Comparable[] a, int i, int j) { return a[i].compareTo(a[j]) < 0; } protected static void exch(Comparable[] a, int i, int j) { Comparable tmp = a[i]; a[i] = a[j]; a[j] = tmp; } static boolean heapLess(Comparable[] a, int i, int j) { return a[i - 1].compareTo(a[j - 1]) < 0; } static void heapExch(Comparable[] a, int i, int j) { Comparable tmp = a[i - 1]; a[i - 1] = a[j - 1]; a[j - 1] = tmp; } static void printArray(Comparable[] a) { System.out.println(Arrays.toString(a)); } }
1.选择排序
package algs; /** * Author: areful * Date: 2018/8/9 */ public class TestSort extends BaseSort { public static void main(String[] args) { Comparable a[] = data(); sort(a); printArray(a); } public static void sort(Comparable[] a) { int N = a.length; for (int i = 0; i < N; i++) { int min = i; for (int j = i + 1; j < N; j++) { if (less(a, j, min)) min = j; } exch(a, i, min); } } }
2.插入排序
package algs; /** * Author: areful * Date: 2018/8/9 */ public class TestSort extends BaseSort { public static void main(String[] args) { Comparable a[] = data(); sort(a); printArray(a); } public static void sort(Comparable[] a) { int N = a.length; for (int i = 0; i < N; i++) { for (int j = i; j > 0 && less(a, j, j - 1); j--) { exch(a, j, j - 1); } } } }
3.希尔排序
package algs; /** * Author: areful * Date: 2018/8/9 */ public class TestSort extends BaseSort { public static void main(String[] args) { Comparable a[] = data(); sort(a); printArray(a); } public static void sort(Comparable[] a) { int N = a.length; int h = 1; while (h < N / 3) h = 3 * h + 1; while (h >= 1) { for (int i = h; i < N; i++) { for (int j = i; j >= h && less(a, j, j - h); j -= h) { exch(a, j, j - h); } } h /= 3; } } }
4.快速排序
package algs; /** * Author: areful * Date: 2018/8/9 */ public class TestSort extends BaseSort { public static void main(String[] args) { Comparable a[] = data(); sort(a); printArray(a); } public static void sort(Comparable[] a) { sort(a, 0, a.length - 1); } private static void sort(Comparable[] a, int lo, int hi) { if (hi <= lo) return; int j = partition(a, lo, hi); sort(a, lo, j-1); sort(a, j+1, hi); } private static int partition(Comparable[] a, int lo, int hi) { int i = lo; int j = hi + 1; while (true) { while (less(a, ++i, lo)) if (i == hi) break; while (less(a ,lo, --j)) if (j == lo) break; if (i >= j) break; exch(a, i, j); } exch(a, lo, j); return j; } }
5.归并排序
package algs; /** * Author: areful * Date: 2018/8/9 */ public class TestSort extends BaseSort { public static void main(String[] args) { Comparable a[] = data(); sort(a); printArray(a); } public static void sort(Comparable[] a) { Comparable[] aux = new Comparable[a.length]; sort(a, aux, 0, a.length - 1); } private static void sort(Comparable[] a, Comparable[] aux, int lo, int hi) { if (hi <= lo) return; int mid = lo + (hi - lo) / 2; sort(a, aux, lo, mid); sort(a, aux, mid + 1, hi); merge(a, aux, lo, mid, hi); } private static void merge(Comparable[] a, Comparable[] aux, int lo, int mid, int hi) { for (int k = lo; k <= hi; k++) { aux[k] = a[k]; } int i = lo, j = mid + 1; for (int k = lo; k <= hi; k++) { if (i > mid) a[k] = aux[j++]; // this copying is unnecessary else if (j > hi) a[k] = aux[i++]; else if (less(aux, j, i)) a[k] = aux[j++]; else a[k] = aux[i++]; } } }
6.堆排序
package algs; /** * Author: areful * Date: 2018/8/9 */ public class TestSort extends BaseSort { public static void main(String[] args) { Comparable a[] = data(); sort(a); printArray(a); } private static void sort(Comparable[] a) { int n = a.length; for (int k = n / 2; k > 0; k--) { sink(a, k, n); } while (n >= 1) { heapExch(a, 1, n--); sink(a, 1, n); } } private static void sink(Comparable[] a, int k, int n) { while (k * 2 <= n) { int j = k * 2; if (j < n && heapLess(a, j, j + 1)) j++; if (!heapLess(a, k, j)) break; heapExch(a, k, j); k = j; } } }