• 常见算法(四)希尔排序


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

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

    如何分组?

    假设又如下数组:

    {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;
                    }
                }

    输出如下:

    记录编程的点滴,体会学习的乐趣
  • 相关阅读:
    flex学习小结
    Frameset框架
    表格的增删改
    【实践】用 js 封装java shuffle函数(打乱数组下标方法)
    【实践】js封装 jq siblings 方法
    【笔记】js原生方法 在元素外部或内部实现添加元素功能(类似jq 的 insert 和 append)
    【实践】js实现windows系统日历
    【实践】用for-in 循环实现三联联动
    【笔记】js Array.prototype.slice.call(arguments) 将函数的参数转换为数组方法的见解
    【笔记】js Function类型 内部方法callee
  • 原文地址:https://www.cnblogs.com/AduBlog/p/13566045.html
Copyright © 2020-2023  润新知