希尔排序(Shell's Sort)又称缩小增量排序(Diminishing Increment Sort),是插入排序的一种改进
基本思想:设定一个元素增量gap,将参加排序的序列按这个间隔数gap从第1个元素开始依次分成若干子序列,对子序列进行排序,然后缩小增量gap,重新将整个序列按照新的间隔数gap进行划分,再分别对每个子序列进行排序,如此将“缩小增量gap——划分序列——将每个子序列进行排序“的操作进行下去,知道间隔数增量gap=1为止;
gap间隔数的选择:如何选择最合适的间隔数序列才能达到最优的排序效果是至今尚未解决的数学难题,我们在一般排序中gap的初始值可设定为N/2(N为排序元素的个数,这里需要注意采用四舍五入的原则),以后每一趟排序,gap值减半,直到gap=1为止;
举例分析:设有一个数据元素序列{3,6,4,2,11,10,5},要求按从小到大顺序排列,排序步骤如下图所示:
从上图和直接插入排序的算法来看,比较次数和交换次数明显少于直接插入排序,代码如下所示(C#实现):
1 public static int[] SortByShellsSort(int[] m_SourceArray) 2 { 3 int tmp; 4 int length = m_SourceArray.Length; 5 //gap如果不能被整除需要+1 6 int gap = length / 2 + (length % 2 == 0 ? 0 : 1); 7 while (gap >= 1) 8 { 9 for (int i = 0; i + gap < length; i++) 10 { 11 if (m_SourceArray[i] > m_SourceArray[i + gap]) 12 { 13 tmp = m_SourceArray[i]; 14 m_SourceArray[i] = m_SourceArray[i + gap]; 15 m_SourceArray[i + gap] = tmp; 16 } 17 } 18 if (gap == 1) break; 19 //gap如果不能被整除需要+1 20 gap = gap / 2 + (gap % 2 == 0 ? 0 : 1); 21 } 22 return m_SourceArray; 23 }
算法分析:希尔排序属于不稳定的排序,时间复杂度为:O(N2), 空间复杂度:O(1)