小蚂蚁学习数据结构(36)——插入排序中的希尔排序

匆匆过客 提交于 2020-03-21 00:02:39

3 月,跳不动了?>>>

    插入排序中的第二种排序方法——希尔排序。

    思路是先将要排序的序列分割成若干个子序列,分别对子序列进行直接插入排序,基本有序后,再对整个序列进行直接插入排序。

    步骤: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



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!