插入排序

public static void sort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {//默认首位已排好序
            int data = arr[i];
            int j = i;
            while (j > 0) {
                if (data > arr[j - 1]) //要排序的元素与前一位比较
                    break;//大则退出
                arr[j] = arr[j - 1];//小则将前一位元素向后移动 留下一个空位
                j--;
            }
            arr[j] = data;//将排序元素赋值给空位
        }
    }

希尔排序

public static void sort(int[] arr) {
        //将元素分组再进行插入排序
        //4, 8, 3, 6, 2, 9 , 5 , 11 , 1
        //n/2=4 步长为4 分为4 2 1| 8 9 | 3 5 | 6 11
        //排序后 1 2 4 | 8 9 | 3 5 | 6 11
        //n/2/2=2 步长为2  1 4 9 5 11|2 8 3 6
        //排序 1 4 5 9 11|2 3 6 8
        //n/2/2/2=1 步长为1 排序后-> 1 2 3 4 5 6 8 9 11

        //最外层为步长循环
        int n = arr.length;
        for (int i = n / 2; i > 0; i = i / 2) { //每次循环步长缩小一半
            for (int j = i; j < n; j++) { //从n/2开始,默认前部分(每个分组的首位)已排好序
                int k = j;
                int data = arr[j];
                while (k >= i) {
                    if (data > arr[k - i])
                        break;
                    arr[k] = arr[k - i];
                    k = k - i;
                }
                arr[k] = data;
            }
        }
    }

归并排序

  1. 图解
    归并排序.png
  2. 代码
public static void sort(int[] arr) {
        //先进行拆分,再进行合并
        split(0, arr.length - 1, arr);
    }

    public static void split(int left, int right, int[] arr) {
        if (left == right) return;
        int mid = (left + right) / 2;//拆分的中间值
        split(left, mid, arr);
        split(mid + 1, right, arr);
        //合
        merge(left, mid, right, arr);
    }

    public static void merge(int left, int mid, int right, int[] arr) {
        int[] temp = new int[right + 1 - left];
        int i = left;
        int j = mid + 1;
        int k = 0;
        while (i <= mid && j <= right) {
            if (arr[i] < arr[j])
                temp[k++] = arr[i++];
            else
                temp[k++] = arr[j++];
        }
        while (i <= mid)
            temp[k++] = arr[i++];
        while (j <= right)
            temp[k++] = arr[j++];
        System.arraycopy(temp, 0, arr, left, temp.length);
    }