希尔排序是对插入排序的一种改进算法,在大规模数据量时可以将平均时间复杂度提升到O(nlogn)级别。它的思想就是进行分段排序,将数据分成多个子序列,将子序列进行排序,之后逐步减小序列的长度直到1,最终实现排序。
步骤一:给定一个增量gap为数组长度的一半,然后创建一个循环,每次增量减半。
步骤二:实现一个以gap值为基础的插入排序,即将插入排序中的1改为gap。
//希尔排序
void shellSort(vector<int>& nums)
{
for (int gap = nums.size() / 2; gap > 0; gap /= 2)
{
for (int i = gap; i < nums.size(); i++)
{
int temp = nums[i];
int j = i - gap;
while (j >= 0 && nums[j] > temp)
{
nums[(int)j + gap] = nums[j];
j -= gap;
}
nums[(int)j + gap] = temp;
}
}
}
希尔排序是一种不稳定的排序算法,即会改变相同元素的位置关系。它的时间复杂度为:
最坏情况:O(n),数组有序。
最好情况:O(),数组逆序。
平均情况:O(nlogn)。