常见算法(四)希尔排序

插入排序试用于小数据且基本有序的数组,因为每次插入数据都要遍历比较大小。那么大数据且基本无序的数组呢。

这是需要时用到希尔排序,希尔排序是分组版本的插入排序

如何分组?

假设又如下数组:

{49,38,65,97,76,13,27,49,55,04}

第一次分组,增量一般是一半

那么此时增量是5,也就是说,49和13一组,38和27一组...

划分的组是:

49---13                                                13---49

38---27                                                27---38

65---49         插入排序后  =》             49---65

97---55                                                55---97

76---04                                                04---76

得到:

{13,27,49,55,04,49,38,65,97,76}

第二次,增量变为原增量一半,取不到整数,取小于它的最大整数

也就是说,此时增量变为2

那么变为

13---49---04---38---97                                                  04---13---38---49---97

                                              插入排序后  =》   

27---55---49---65---76                                                   27---49---55---65---76

得到:

{04,27,13,49,38,55,49,65,97,76}

最后,增量变为1,不可再小

{04,13,27,38,49,49,55,65,76,97}

经过小数据量的几轮插入排序,数组已经变的基本有序了,在进行插入排序也就简单了

代码实现如下:

int[] arr = { 1, 9, 2, 4, 6, 7, 3,5};
            //计算初始增量
            for(double gap = arr.Length / 2; gap>0;gap=Math.Floor(gap/2))
            {
                //增量后面的数
                for(int i=(int)gap; i<arr.Length; i++)
                {
                    int temp = arr[i];
                    int j;
                    //换位置移动的是增量的长度,而不是1
                    for(j=i-(int)gap;j>=0 && arr[j] > temp; j-=(int)gap)
                    {
                        //互换位置,而不是向后移动
                        arr[j+(int)gap] = arr[j];
                    }
                    arr[j + (int)gap] = temp;
                }
            }

输出如下:

记录编程的点滴,体会学习的乐趣
原文地址:https://www.cnblogs.com/AduBlog/p/13566045.html