【C# 排序】希尔排序Shell's Sort

背景

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。 希尔排序是非稳定排序算法。 该方法因D.L.Shell 于1959 年提出而得名。

定义

希尔排序︰先将待排序表分割成若干形如L[i,i + d,i + 2d..., i + kd]的“特殊”子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止。 增量可以自己设定通常是增量序列=元素个数/2

使用要求

适用性:仅适用于顺序表,不适用于链表

基本有序或有序的顺序表,如下图:

 

 

 时间复杂度

和增量序列d, de, d...的选择有关,目前无法用数学手段证明确切的时间复杂度
最坏时间复杂度为O(n2),当n在某个范围内时,可达O(n1.3)

 图解排序过程

要排序的列表

 

 

(1)第一趟排序,增量序列=元素个数/2,然后对各个子表进行插入排序

 

 

 

 

第一趟排序完成的结果如下:

 

(2)在第二趟排序的在第一趟排序的结果上,继续排序

 

 

 第二趟排序结果如下:

 

 

 

 (3)第三趟排序,在第二趟排序的结果上,继续排序

 

 

 排序后的结果如下:

 算法

C# 代码

 

public static class Sort
 {
 public static void StraightInsertionSortOfShell(int[] array,int step)
        {
            //第一个for 划分小组
            int it = 0;
            for ( ; step >= 1; step = step / 2)
            {
                
                //对小组排序
                for (int j = 0 + step; j < array.Length; j=j + step)
                {
                    if (j == 0) continue;
                    int index = j;
                    while(array[index - step] > array[index])
                    {
                        it = array[index];
                        array[index]=array[index-step];
                        array[index - step] = it;
                        index=index-step;
                        if (index < step) break;
                    }
              

                }


            }
        }

}

 

posted @ 2022-06-11 18:15  小林野夫  阅读(175)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/