希尔排序跟直接插入排序很像,相当于每次把数列分成若干个区间进行直接插入排序
void shell_sort(int* a, int n)
{
int gap = n / 2; //gap分割待排序的序列,开始等于数组大小的一半,然后每次除以二,如果gap一直是1就相当于直接插入排序了
while (gap != 0)
{
for (int i = gap; i < n; ++i) //对所有相隔gap位置的元素进行直接插入排序
{
int j = i - gap;
int temp = a[i];
while (j >= 0 && a[j] > temp)
{
a[j + gap] = a[j];
j = j - gap;
}
a[j + gap] = temp;
}
gap = gap / 2; //每次减半,当gap == 1时相当于序列所有值进行直接插入排序
}
}
由于希尔排序的gap选择不一定,导致其时间复杂度比较难分析
一般取时间复杂度:O(n^(1.3))
空间复杂度:O(1)