希尔排序

 

数据结构 数组
最差时间复杂度 O(n log^2 n)
最优时间复杂度 O (n log^2 n)
平均时间复杂度 O(n log n)
空间复杂度 O(1)
排序方式 in-place
稳定性 不稳定
比较次数 n*(n-1)/2
适用场景  

 

 

 

 

 

 

 

 

 

 

 

 

  希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种
更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
  希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,
当增量减至1时,整个文件恰被分成一组,算法便终止

思路:

初始数据:74 88 69 67 75   72 11 89 77 60 
gap=5(分5组,每组进行插入排序) 74和72:  72 88 69 67 75 74 11 89 77 60 88和11:  72 11 69 67 75 74 88 89 77 60 69和89:  72 11 69 67 75 74 88 89 77 60 67和77:  72 11 69 67 75 74 88 89 77 60 75和60:  72 11 69 67 60 74 88 89 77 75
gap=2(分2组,每组进行插入排序)(72、69、60、88、77)(11、67、74、89、75)
第一组结果:  60 11 69 67 72 74 77 89 88 75 第二组结果:  60 11 69 67 72 74 77 75 88 89
gap=1(整个数组进行插入排序) 结果:  11 60 67 69 72 74 75 77 88 89 ________________________________________________ 数组个数为奇数 74 88 69 67 75 72 11 89 77 60 10 初始数据
gap=5(分5组,每组进行插入排序)
第一组:  72 88 69 67 75 74 11 89 77 60 10(74、72、10 插入排序)
其余同上。

  

代码:

    public class ShellSort : SortBase, ISort
    {
        public void Sort()
        {
            int n = arr.Length;
            int i, j, gap;

            // gap为步长,每次减为原来的一半。
            for (gap = n / 2; gap > 0; gap /= 2)
            {
                // 共gap个组,对每一组都执行直接插入排序
                for (i = 0; i < gap; i++)
                {
                    for (j = i + gap; j < n; j += gap)
                    {
                        // 如果arr[j] < arr[j-gap],则寻找arr[j]位置,并将后面数据的位置都后移。
                        if (arr[j] < arr[j - gap])
                        {
                            int tmp = arr[j];
                            int k = j - gap;
                            while (k >= 0 && arr[k] > tmp)
                            {
                                arr[k + gap] = arr[k];
                                k -= gap;
                            }
                            arr[k + gap] = tmp;
                        }
                    }
                }
            }
            base.output(arr);
        }




        public void Sort2()
        {

        }

    }

 

posted @ 2019-01-22 11:48  luanxm  阅读(497)  评论(0编辑  收藏  举报