插入排序中的第二种排序方法——希尔排序。shell
思路是先将要排序的序列分割成若干个子序列,分别对子序列进行直接插入排序,基本有序后,再对整个序列进行直接插入排序。spa
步骤:1,分割成若干子序列。2,对子序列进行直接插入排序。3,知道增量为1,进行一次所有直接插入排序便可。
.net
希尔排序是一种不稳定排序,可是相比较直接插入排序,在时间复杂度上仍是有很大程度的提高。
code
直接插入排序的时间复杂度是n^2,而希尔排序的时间复杂度为n^(3/2)。
blog
# 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排序