lyuan428

一,概览

算法名称 平均时间复杂度 稳定
插入排序 \(O(n^2)\)
希尔排序
Sort接口
public interface Sort {

    default boolean less(int[] a,int i ,int j){
        return a[i] < a[j];
    }

    default boolean more(int[] a,int i ,int j){
        return a[i] > a[j];
    }

    default void exch(int[] a,int i ,int j){
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }

    void sort(int[] a);

}

1、插入排序

基本原理:在一个有序序列中,插入一个新的元素,使插入后的数据依旧有序。
即,a[0..i-1] 有序,将a[i] 插入适当的位置,使 a[0..i] 有序。

public class InsertSort implements Sort {
    @Override
    public void sort(int[] a) {
        for (int i = 1; i < a.length; i++) {
            for (int j = i; j >= 1 && less(a, j, j - 1); j--) {
                exch(a, j, j - 1);
            }
        }
    }
}

2、希尔排序

基本原理:是插入排序的改进算法,通过增加交换元素之间的步长,来减少交换次数。

public class ShellSort implements Sort {
    @Override
    public void sort(int[] a) {
        int h = 1;
        while (h * 3 + 1 < a.length) {
            h = h * 3 + 1;
        }
        while (h>=1){
            for (int i = h; i < a.length; i += h) {
                for (int j = i; j >= h && less(a, j, j - h); j -= h) {
                    exch(a, j, j - h);
                }
            }
            h = h / 3;
        }
    }
}

3、归并排序

基本原理:将两个有序数组合并,使合并的数组依旧有序。

public class MergeSort implements Sort {

    @Override
    public void sort(int[] a) {
        int[] aux = new int[a.length];
        sort(a, 0, a.length - 1, aux);

    }

    public void sort(int[] a, int lo, int hi, int[] aux) {
        if (lo >= hi) {
            return;
        }
        int mid = (hi - lo) / 2 + lo;
        sort(a, lo, mid, aux);
        sort(a, mid + 1, hi, aux);
        merge(a, lo, mid, hi, aux);
    }

    public void merge(int[] a, int lo, int mid, int hi, int[] aux) {
        for (int i = lo; i <= hi; i++) {
            aux[i] = a[i];
        }
        int i = lo;
        int j = mid + 1;
        for (int k = lo; k <= hi; k++) {
            if (i > mid)
                a[k] = aux[j++];
            else if (j > hi)
                a[k] = aux[i++];
            else if (less(aux, i, j))
                a[k] = aux[i++];
            else
                a[k] = aux[j++];
        }
    }
}

源码地址
参考资料:算法4

分类:

算法

技术点:

相关文章: