美文网首页
插入排序之希尔排序

插入排序之希尔排序

作者: 于阗 | 来源:发表于2017-07-11 17:08 被阅读114次

    基本思路:
      希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本。它的作法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规定。
    希尔排序是基于插入排序的以下两点性质而提出改进方法的:
    插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
    但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位

    步骤:
      (1) 先取一个正整数 d1(d1 < n),把全部记录分成 d1 个组,所有距离为 d1 的倍数的记录看成一组,然后在各组内进行插入排序;
      (2)然后取 d2(d2 < d1);
      (3)重复上述分组和排序操作;直到取 di = 1(i >= 1) 位置,即所有记录成为一个组,最后对这个组进行插入排序。一般选 d1 约为 n/2,d2 为 d1 /2, d3 为 d2/2 ,…, di = 1。

    实例分析
      假设有数组 array = [80, 93, 60, 12, 42, 30, 68, 85, 10],首先取 d1 = 4,将数组分为 4 组,如下图中相同颜色代表一组:



    然后分别对 4 个小组进行插入排序,排序后的结果为:

    然后,取 d2 = 2,将原数组分为 2 小组,如下图:


    然后分别对 2 个小组进行插入排序,排序后的结果为:


    最后,取 d3 = 1,进行插入排序后得到最终结果:

    代码实现

    public class Shellsort {
    
        public static void main(String[] args){
            int[] a= {1,2,5,3,1,667,222,3};
            sort(a);
            System.out.println(Arrays.toString(a));
        }
    
        public static void sort(int[] a){
            int gap=1, i, j, len=a.length;
            int temp;
            while(gap<len/3){
                gap = gap*3+1;
                }
            for(;gap >0; gap/=3){
                for(i=gap; i<len; i++){
                    temp = a[i];
                    for(j=i-gap;j>=0&&a[j]>temp;j-=gap)
                        a[j+gap] = a[j]; //交换位置
                    a[j+gap] = temp; //交换位置
                }
            }
        }
        
    }
    
    

    相关文章

      网友评论

          本文标题:插入排序之希尔排序

          本文链接:https://www.haomeiwen.com/subject/sijmhxtx.html