希爾排序法

將相距一個增量單位的元素集組成一個子集,然後通過以子集爲單位對數據進行比較,最後得到子集間的數據是有序的,但是子集內德數據還未排序。這樣繼續縮小增量循環比較進行互換位置處理,直到增量變爲1時爲最後一次循環比較。

希爾排序算法突破了O(n^2)的時間複雜度。

#include <stdio.h>    

#define MAXSIZE 100  /* 待排序數組的大小 */

typedef struct
{
	int r[MAXSIZE+1];	/* 待排序數組r,r[0]爲哨兵或臨時變量 */
	int length;			/* 待排序數組的長度,爲了方便理解,不包含r[0]元素 */
}SortList;

/* 希爾排序算法 */
void ShellSort(SortList *L)
{
	int i,j,k=0;
	/* 初始化增量爲待排序數組的長度 */
	int increment=L->length;
	do
	{
		/* 設置增量 */
		increment=increment/3+1;
		for(i=increment+1; i<=L->length; i++)
		{
			/* 比較r[i]與r[i-increment]的值,即相差一個增量的元素相互比較 */
			if (L->r[i]<L->r[i-increment])
			{ 
				/* r[i]記錄暫存到r[0]中 */
				L->r[0]=L->r[i]; 
				for(j=i-increment; j>0 && L->r[0]<L->r[j]; j-=increment) {
					L->r[j+increment]=L->r[j]; 
				}
				L->r[j+increment]=L->r[0];	/* 插入到相應位置 */
			}
		}
	}
	while(increment>1);
}
時間複雜度分析:

由於希爾排序是基於增量把數組分成幾個子集的,從而實現了跳躍式的移動,提高了排序效率。

而增量大小的選擇直接影響了排序的效率。研究表明當增量序列爲increment[n]=2^(t-k+1) (0<=k<=t<=log2(n+1))時,排序的效率比較高,時間複雜度爲O(n^(3/2))。

希爾排序是一種不穩定的排序算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章