希尔排序:是插入排序的一种优化版。对于插入排序或者冒泡排序,如果数组的最大值刚好是在第一位,要将它挪到正确的位置就需要 n - 1 次移动。也就是说,原数组的一个元素如果距离它正确的位置很远的话,则需要与相邻元素交换很多次才能到达正确的位置。希尔排序加快了交换速度,交换不相邻的元素以对数组的局部进行排序。
// 希尔排序(插入排序的改进版)
void ShellSort(int arr[],int length)
{
if (arr == nullptr || length <= 0)
{
return;
}
for (int gap = length/2; gap > 0; gap/=2) // 划分间隔大小
{
for (int i = gap; i < length; i++)
{
int temp = arr[i];
int k = i;
for (int j = i-gap; j >= 0; j = j-gap)
{
if (temp < arr[j])
{
arr[j + gap] = arr[j];
k = j;
}
}
arr[k] = temp;
}
}
}