zoukankan      html  css  js  c++  java
  • 小白懂算法之希尔排序

    一.希尔排序介绍

      希尔排序是属于插入排序的一种,是直接插入排序算法的一种优化

    二.算法原理

      希尔排序是根据步长step进行分组(比如说[1,2,3,4,5,6,7,8],步长为2,则[1,3,5,7]为一组,[2,4,6,8]为一组,不要理解成[1,2,3,4]为一组,不然下面的代码你会搞混的),然后对分组后的序列进行插入排序,插入排序的进行是在同一组内进行的。当本次step分组排序完毕,进行下一轮step分组直至step =1为止,即整个数据合成一组,构成一组有序记录,完成排序;

    三.图解

     

     四.代码实现(Java实现)

        private static void shellSort(int[] arr) {
            /**
             *     实现思路:
             *         1.定义步长,逐渐缩小步长的长度,直到0为止
             *         2.使用三重循环:
             *             >第一重循环控制的是每轮步长的不同
             *             >第二重循环控制的是当前节点,即和前面元素比较的值
             *             >第三重循环控制的是在同一组内当前节点与前面的元素进行插入排序
             */
            
            for(int step=arr.length/2;step>0;step/=2) {    //控制每一大轮步长,比如初始步长为4,下轮步长为2,只要步长>0即可进行
                
                for(int i=step;i<arr.length;i++) {    //这一层控制的当前节点,当前节点是需要和前面的元素逐一比较的,也就是插入法
                    
                    int temp = arr[i];    //将当前的节点保存起来
                    int j;    //这个j是临时保存同一组内当前节点前面的元素,这里说的组是根据步长划分出来的,举个数组[1,2,3,4],步长为2,则1,3为一组,2,4为一组
                    
                    for(j=i-step;j>=0 && arr[j]>temp;j-=step) {    //当前节点和同一组前面的元素进行比较
                        arr[j + step] = arr[j];    //元素后移动step位
                    }
                    arr[j + step] = temp;    //在同一组内,插入到当前节点前面的某个元素后的step位
                }
            }
            
        }

      强调:

        》上面的gif图片是我从其他博客拿过来的,只是为了方便大家理解,但我告诉大家,在上面的代码实现,实际的执行过程不是图解的那样;在第二重循环中,i 记录的是当前的节点,从step开始,即从第二个区间首个元素开始作为当前节点,i++也意味着第二个区间首个元素及后面的全部元素都会作为当前节点,每轮遍历都是换组的,你要记住这点。

        》里面的两层循环其实就是插入排序,只不过从之前的相邻元素变成相邻step位而已。

    资料参考:

      https://www.cnblogs.com/luomeng/p/10592830.html

  • 相关阅读:
    【操作系统】 管程机制
    【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))
    【操作系统】 信号量机制
    【Java】 奇偶数的判断
    【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))
    MySQL之库操作
    数据库简介
    MySQL的知识海洋
    python并发编程之多进程(理论)
    python并发编程之多进程(实现)
  • 原文地址:https://www.cnblogs.com/ibcdwx/p/13986949.html
Copyright © 2011-2022 走看看