插入排序与希尔排序的联系

插入排序与希尔排序的关系是什么呢?

插入排序

简化版

	//先把arr数组中的2,插入到1,3之间
        int[] arr = {1, 3, 5, 7, 2};
		//-1插到1前面,必须保证end>0
        int[] arr1 = {1, 3, 5, -1};

        //数组最后一位元素的下标
        int end = arr.length - 1;
        while (end > 0 && arr[end - 1] > arr[end]) {
            int temp = arr[end];
            arr[end] = arr[end - 1];
            arr[end - 1] = temp;
            end--;
        }

        System.out.println(Arrays.toString(arr));

插入排序无非就是把end从第二个数组元素开始,把end值一直加1。

		
	int[] arr = {13, 11, 15, -11, 99, -10, 0, 22};
        for (int i = 0; i < arr.length - 1; i++) {
            for (int end = i+1; end > 0 && arr[end - 1] > arr[end]; end--) {
                int temp = arr[end];
                arr[end] = arr[end - 1];
                arr[end - 1] = temp;
            }
        }

        System.out.println(Arrays.toString(arr));

高级版的插入排序




int[] arr = { 5, 93, 8, 92, 7, 91, 6, 90, 1 };
    int k = 1;
    for (int i = k; i < arr.length; i++) {
        int temp = arr[i];
        int j = i - k;

        for (; j >= 0 && arr[j] > temp; j -= k) {
            arr[j + k] = arr[j];
        }

        arr[j + k] = temp;
    }
System.out.println(Arrays.toString(arr));
    //[1, 5, 6, 7, 8, 90, 91, 92, 93]

希尔排序

希尔排序只是在插入排序上,多了个跨度k,每个k跨度,进行一次插入排序。

 public static void test() {
        //希尔排序

        int[] arr = {13, 11, 15, -11, 99, -10, 0, 22};

        //准备跨度的序列
        int k = 1;
        while (k < arr.length) {
            k = k * 2 + 1;
        }
     
        //循环跨度 13 4 1
        while (k > 0) {
            //根据跨度来进行分组
            //思考:为什么从g开始而不是从0开始:子序列是插入排序
            for (int i = k; i < arr.length; i++) {
                //找到当前分组的第一个要排序的值
                int temp = arr[i];//这是我们要插入的值
                int j = i - k;//找到当前子序列的前一位
                //插入排序
                //倒序找前一位,允许游标为负值,游标为负值,不再进入
                while (j >= 0 && arr[j] > temp) {
                    //谁和谁交换
                    arr[j + k] = arr[j];//把当前的交给前面一位
                    j -= k;//继续找下一个,直到下一个的游标小于0
                }
                //把最后一位补上
                arr[j + k] = temp;
            }
            System.out.println("跨度:" + k);
            k /= 2;
        }

        System.out.println(Arrays.toString(arr));

    }






备注:最近来手感,写了个类似Tomcat服务

github地址:https://github.com/cnamep001/my_tomcat.git