希爾排序(Shell Sort)又稱“縮小增量排序”(Diminishing Increment Sort)是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。
void ShellSort1(int* arr, int length)
{
int i, j, gap;//步長
for (gap = length / 2; gap >=1; gap /= 2)
for (i = 0; i < gap; i++) //直接插入排序
{
for (j = i + gap; j < length; j += gap)
if (arr[j] < arr[j - gap])
{
int temp = arr[j];
int k = j - gap;
while (k >= 0 && arr[k] > temp)
{
arr[k + gap] = arr[k];
k -= gap;
}
arr[k + gap] = temp;
}
}
}
void ShellSort2(int* arr, int length)
{
int j, gap;
for (gap = length/ 2; gap > 0; gap /= 2)
for (j = gap; j < length; j++)//從數組第gap個元素開始
if (arr[j] < arr[j - gap])//每個元素與自己組內的數據進行直接插入排序
{
int temp = arr[j];
int k = j - gap;
while (k >= 0 && arr[k] > temp)
{
arr[k + gap] = arr[k];
k -= gap;
}
arr[k + gap] = temp;
}
}
void ShellSort3(int* arr, int length)
{
int i,j,gap; //gap是步長
for (gap = length / 2; gap >= 1; gap /= 2)
for (i = gap; i < length; i ++)//對步長爲gap的元素進行直插排序,當gap爲1時,直插排序
for(j=i-gap;j>=0&&arr[j]>arr[j+gap];j-=gap)
Swap(&arr[j],&arr[j+gap]);
}
時間複雜度:最佳情況O(n^1.3),最壞情況O(n^2),平均時間複雜度O(nlogn)~O(n^2)
空間複雜度:O(1)