Loading...

排序算法

算法(第四版)

排序模板

public class Example {

    /*排序算法*/
    public static void sort(Comparable[] a) {

    }

    /*比较两个数的大小*/
    private static boolean less(Comparable v, Comparable w) {
        //System.out.println("a".compareTo("b"));//-1  ==> -1 < 0 true
        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 = {"a", "d", "m", "c", "x", "e"};
        System.out.print("排序前:");
        show(a);
        sort(a);
        assert isSorted(a);
        System.out.print("排序后:");
        show(a);
    }
}

选择排序

public static void sort(Comparable[] a) {
    //获取数组长度
    int s = a.length;
    for (int i = 0; i < s; i++) {
        //每次i都为剩余要排序数组的第一个下标索引
        int min = i;
        for (int j = i + 1; j < s; j++) {
            //min存储最小值的下标
            if (less(a[j], a[min])) {
                min = j;
            }
        }
        //获取索引以i+1开始的数组的最小值索引与i的索引进行交换
        exch(a, i, min);
    }
}

插入排序

public static void sort(Comparable[] a) {
    //获取数组长度
    int s = a.length;
    //外层循环将a[]数组按升序排序
    for (int i = 1; i < s; i++) {
        //内层循环将新的下标对应的值插入到正确的位置
        for (int j = i; j > 0 && less(a[j], a[j-1]); j--) {
            exch(a, j, j - 1);
        }
    }
}

希尔排序

public static void sort(Comparable[] a) {
    //获取数组长度
    int s = a.length;
    int h = 1;
    //扩大h的步长
    while (h < s) {
        h = 3 * h + 1;// 1, 4, 13, 40, 121, 364, 1093,···
    }
    while (h >= 1) {
        //按照h的大小对整个数组进行分段,然后排序,使每个分组内都是有序的
        for (int i = h; i < s; i++) {
            for (int j = i; j > 0 && less(a[j], a[j - h]); j -= h) {
                exch(a, j, j - h);
            }
        }
        //减小h的步长,当h=1时,希尔排序相当于选择排序
        h /= 3;
    }
}
posted @ 2020-12-08 17:00  iniwym  阅读(53)  评论(0编辑  收藏  举报