希尔排序是在直插排序的基础上进行的一直增量排序(其实是一种分组排序)

希尔排序比直插排序好在利用了直插排序的特点:有序时时间复杂度小

基本思想也是核心步骤:

  1. 按照一定分量来分组

  2. 对于每组进行直插排序




给个简单示例:

待排序数组:    [7, 6, 3, 4, 5, 2, 1]    

第一次   :    [4, 6, 3, 7, 5, 2, 1]    分量n=7/2=3

            [1, 6, 3, 4, 5, 2, 7]

         [1, 5, 3, 4, 6, 2, 7]

         [1, 5, 2, 4, 6, 3, 7]

第二次   :    [1, 5, 2, 4, 6, 3, 7]    分量n=n/2=1

               [1, 2, 5, 4, 6, 3, 7]

               [1, 2, 4, 5, 6, 3, 7]

               [1, 2, 4, 5, 6, 3, 7]

               [1, 2, 3, 4, 5, 6, 7]

               [1, 2, 3, 4, 5, 6, 7]   //结束


核心代码:

for(int gap =n/2;gap>0;gap/=2){
    for(int i=0;i<gap;i++){
	for(int j=i+gap;j<n;j+=gap){
            int temp = array[j];
	    int k=j-gap;
	    while(k>=0&&array[k]>temp){
		array[k+gap]=array[k];	
		k-=gap;
	    }
	    array[k+gap]=temp;
	}
    }
}


该算法的分析:

  1. 稳定性: 不稳定

  2. 时间复杂度:

     希尔排序的执行时间依赖于增量取值。

     由于希尔排序的目的是增加有序的趋势,所以希尔排序的性能优于直接插入排序。

  3. 空间复杂度:

      也仅仅只需要一个单元--temp。


希尔有很多简化方式,那是因为在增量为1时肯定会排好。但是希尔排序的优化却仅仅取决于增量的选取,但如何选取最优增量似乎还没有最好的方法。