void ShellSort(int arr[], int length)
{
int increasement = length;
int i, j, k;
do
{
// 确定分组的增量
increasement = increasement / 3 + 1;
//取increasement,将数组分成increasement个子序列
for (i = 0; i < increasement; i++)
{
//对每个子序列进行排序算法之直接插入排序
for (j = i + increasement; j < length; j += increasement)
{
if (arr[j] < arr[j - increasement])
{
int temp = arr[j];
for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement)
{
arr[k + increasement] = arr[k];
}
arr[k + increasement] = temp;
}
}
}
} while (increasement > 1);
}
解析:
(1)希尔排序又称为缩小增量排序,该方法的基本思想是:设待排序元素序列有n个元素,首先取一个整数increasement(小于n)作为间隔将全部元素分为increasement个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行排序算法之直接插入排序。然后缩小间隔increasement,重复上述子序列划分和排序工作。直到最后取increasement = 1,将所有元素放在同一个子序列中排序为止。
(2)由于开始时,increment的取值较大,每个子序列中的元素较少,排序速度较快,到排序后期increment取值逐渐变小,子序列中元素个数逐渐增多,但由于前面工作的基础,大多数元素已经基本有序,所以排序速度仍然很快。
转载自:https://blog.csdn.net/weixin_37818081/article/details/79202115