小螞蟻學習數據結構(36)——插入排序中的希爾排序

    插入排序中的第二種排序方法——希爾排序。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排序

相關文章
相關標籤/搜索