插入排序中的第二种排序方法——希尔排序。
思路是先将要排序的序列分割成若干个子序列,分别对子序列进行直接插入排序,基本有序后,再对整个序列进行直接插入排序。
步骤:1,分割成若干子序列。2,对子序列进行直接插入排序。3,知道增量为1,进行一次全部直接插入排序即可。
希尔排序是一种不稳定排序,但是相比较直接插入排序,在时间复杂度上还是有很大程度的提升。
直接插入排序的时间复杂度是n^2,而希尔排序的时间复杂度为n^(3/2)。
# include <stdio.h>
void shellSort( int * a, int n )
{
int dk, j, i, t;
//首先,先确定增量
dk = n/2;
//增量循环递减
while( dk >= 1 )
{
//内部实际上就是一个直接插入排序
for( i = dk; i < n; ++i )
{
//将确定的值赋予一个中间变量
t = a[i];
//直接插入排序,但是j是按照增量递减的
for( j = i - dk; j >= 0 && t < a[j]; j-=dk )
{
a[ j + dk ] = a[j];
}
a[ j + dk ] = t;
}
--dk;
}
}
int main( void )
{
int i;
int a[6] = { 55, 68, 25, 16, 89, 2 };
shellSort( a, 6 );
for( i = 0; i < 6; ++i )
{
printf( "%d\n", a[i] );
}
return 0;
}
/*
VC++6.0输出的结果是
=================================
2
16
25
55
68
89
=================================
结论:
希尔排序和直接插入排序的关键就在于希尔排序是按照增量递减的方式排序。
其他的和直接插入排序一样。
*/
学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blog
来源:oschina
链接:https://my.oschina.net/u/1423209/blog/634727