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( ).