(2.7)希爾排序

1.希爾排序(縮小增量法)

  • 基本思想:
    分割成若干個較小的子文件,對各個子文件分別進行直接插入排序,當文件達到基本有序時,再對整個文件進行一次直接插入排序。

  • 對待排記錄序列先作“宏觀”調整,再作“微觀”調整。
    “宏觀”調整,指的是,“跳躍式”的插入排序。

2.排序過程

  • 首先將記錄序列分成若干子序列,
  • 然後分別對每個子序列進行直接插入排序,
  • 最後待基本有序時,再進行一次直接插入排序
  • 例如:將 n 個記錄分成 d 個子序列:
    d個數據分爲1組
{ R[1], R[1+d], R[1+2d], …, R[1+kd] }
{ R[2], R[2+d], R[2+2d], …, R[2+kd] }{ R[d], R[2d], R[3d], …, R[kd], R[(k+1)d] }

其中, d 稱爲增量,它的值在排序過程中從大到小逐漸縮小,直至最後一趟排序減爲 1。
  • 例 初始: 49 38 65 97 76 13 27 48 55 4
    在這裏插入圖片描述
  • 代碼
//r是待排序的記錄,d是增量序列,一共有T個
void shellsort(JD r[], int n, in d[], int T)
{
	int i,j,k;
	JD x;
	k=0;
	
	//循環每一趟進行分組,組內進行簡單插入排序
	while(k < T)
	{
		//i爲未排序記錄的位置
		for (i=d[k]+1;i<=n;i++)
		{
			x=r[i];
			j=i-d[k];
			//j爲本組i前面的記錄位置
			while ((j>0)&&(x.key<r[j].key))
			{
				//組內簡單插入排序
				r[j+d[k]]=r[j];
				j=j-d[k];
			}
			r[j+d[k]]=x;
		}
		k++;
	} 
}

3.最壞複雜度分析

  • 定理: 使用希爾增量的最壞時間複雜度爲 O( N2N^2 ).
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章