【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; } } } } }
编程是个人爱好