希尔排序法又称缩小增量法。
希尔排序法的基本思想是:先选定一个增量整数dk,把待排序文件中所有记录分成若干个组,所有距离为dk的记录分在同一组内,并对每一组内的记录进行排序。
然后,取缩小增量的方法重复上述分组和排序的工作。当增量到达1时,所有记录在统一组内排好序。
如图所示:
代码实现如下:
void ShellInsert(int* arr, int left,int right, int dk)
{
for (int i = left+dk; i < right; i++)
{
if (arr[i] < arr[i - dk])
{
int temp = arr[i];
int end = i - dk;
while (end >= left && temp < arr[end])
{
arr[end + dk] = arr[end];
end -= dk;
}
arr[end+dk] = temp;
}
}
}
int dtal[] = {
5,3,2,1 };//增量
void ShellSort(int* arr, int left, int right)
{
int t = sizeof(dtal) / sizeof(dtal[0]);
for (int i = 0; i < t; i++)//趟数
{
ShellInsert(arr, left,right,dtal[i]);
}
}
可能有的人会有疑惑,增量应该怎么设置.数据量少,增量可以我们自己随便定。如果数据量大怎么设置呢?那么,下面就是改良版希尔排序。
代码如下:
//改良版希尔排序
void ShellSort(int* arr, int left, int right)
{
int dk = right - left;
while (dk > 1)
{
dk = dk / 3 + 1;
for (int i = left + dk; i < right; i++)
{
if (arr[i] < arr[i - dk])
{
int temp = arr[i];
int end = i - dk;
while (end >= left && temp < arr[end])
{
arr[end + dk] = arr[end];
end -= dk;
}
arr[end + dk] = temp;
}
}
}
}