一、思想
希尔排序,由D.L. Shell于1959年提出,是基于插入排序的一种改进算法。它的主要思想是将待排序的序列分割成若干个子序列,这些子序列的元素是相隔一定“增量”的。然后对每个子序列进行直接插入排序。随着增量的逐步减小,整个序列将变得越来越有序。当增量减至1时,整个序列会进行最后一次直接插入排序,此时整个序列变为一个子序列,排序完成。
希尔排序的工作原理包括分组、增量的选择和排序过程。
希尔排序首先按照某个增量将序列分组,然后对每个子序列执行插入排序。由于开始时增量较大,子序列中元素较少,因此可以快速完成排序。随着增量递减,子序列包含的元素越来越多,但此时大部分元素已经基本有序,插入排序依然高效。最终当增量减少到1时,进行最后一轮直接插入排序,确保整个序列完全有序。
总之,希尔排序的效率很大程度上取决于增量序列的选择,不同的增量序列可能导致排序性能的显著差异。虽然到目前为止没有找到最佳的增量序列,但通过合理选择增量序列,希尔排序在大数据集上通常表现出比传统插入排序更好的性能
二、图解
首先对数组按照步长进行分组
分组之后进行组内插入排序,也就是同一组的元素直接进行插入排序
然后调整步长重复上述操作,直到步长为1
三、代码实现
void shell_sort(vector<int>& arr) {vector<int> gaps = {static_cast<int>(arr.size() / 2), static_cast<int>(arr.size() / 3), 1};for (auto gap : gaps) {for (int i = gap; i < arr.size(); i++) {int t = arr[i], j = i - gap;for (j = i - gap; j >= 0; j -= gap) {if (arr[j] > t) arr[j + gap] = arr[j];else break;}arr[j + gap] = t;}}
}