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


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

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

    插入排序

    简化版

    	//先把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






  • 相关阅读:
    Java操作redis
    Ajax & Json
    【转载】K8s-Pod时区与宿主时区时区同步
    【转载】Python中如何将字符串作为变量名
    【转载】python实现dubbo接口的调用
    机器学习避坑指南:训练集/测试集分布一致性检查
    机器学习深度研究:特征选择中几个重要的统计学概念
    机器学习数学基础:学习线性代数,千万不要误入歧途!推荐一个正确学习路线
    被 Pandas read_csv 坑了
    print('Hello World!')的新玩法
  • 原文地址:https://www.cnblogs.com/k-class/p/13684366.html
Copyright © 2020-2023  润新知