2. 希爾(Shell)排序
希爾排序中維護着一個按照某個規律逐漸縮小的增量,算法則按照這個增量的間距比較元素,進行子序列的插入排序,直到增量變爲1,完成最後一輪比較排序。
希爾排序時間複雜度最壞情況下爲O(n2),其平均時間複雜度與每次選擇的增量密切相關,但要優於插入排序。
下面的實現中,增量Increment的選擇爲N/2(N爲原始數組的長度)。從代碼中可以看出每一輪的比較和交換,都是由較小的選擇排序組成。
void ShellSort(ElementType A[], int N)
{
int i, j, Increment;
ElementType Tmp;
for(Increment = N/2; Increment > 0; Increment /= 2)
{
for(i = Increment; i < N; i++)
{
Tmp = A[i];
for(j = i; j >= Increment; j -= Increment)
{
if(Tmp < A[j - Increment])
A[j] = A[j - Increment];
else
break;
}
A[j] = Tmp;
}
}
}