前言
希尔排序是在建立在直接插入排序上的优化版,首先要先掌握直接插入排序。
一、希尔排序思路
第一步:预排序
当待排序列接近有序时,再对待排序列进行直接插排非常的快,首先将排序列接近有序。
第二步:
对预排序后的数组进行直接插入排序。
二、预排序
当进行直接插入排序时,是当前下标 i 所在元素与 i + 1 所在元素比较。
进行预排时,使当前下标 i 所在元素和 i + gap 所在元素比较。
当 gap = 3 时:
当gap = 4 时
可以发现,gap越小,预排序后的序列越接近有序,但效率越低。gap越大,预排后的序列越不接近有序,但效率越高。 当gap = 1 时,就是直接插入排序
代码示例:
void ShellSort(int* arr, int n)
{
if (arr == NULL || n <= 1)
return;
int gap = n;
while (gap > 1)
{
//保证最后一次 gap等于1 进行直接插入排序
gap = gap / 3 + 1;
//多组并排进行插入排序
int i;
for (i = 0; i < n - gap; i++)
{
int end = i;
int tmp = arr[end + gap];
while (end >= 0)
{
if (tmp < arr[end])
{
arr[end + gap] = arr[end];
end -= gap;
}
else
{
break;
}
}
arr[end + gap] = tmp;
}//end of for
}//end of while
}