希尔排序通过分组插入和逐步缩小增量实现高效排序,时间复杂度约O(n^1.3),优于普通插入排序;其核心思想是用递减的增量序列将数组分组进行插入排序,使元素快速接近最终位置;C++实现中采用gap=n/2开始的递减序列,内层循环对每个子序列插入排序;使用Knuth序列等更优增量可提升性能,算法为原地但不稳定排序。
希尔排序是一种基于插入排序的高效排序算法,它通过将原始数组分成若干个子序列进行插入排序,逐步缩小间隔,最终完成整体排序。相比普通插入排序,希尔排序在处理大规模数据时性能更优,时间复杂度可达到 O(n^1.3) 左右,具体取决于增量序列的选择。
希尔排序又叫“缩小增量排序”,它的核心在于:
这样做的好处是:前期通过大步长排序让元素快速接近其最终位置,后期用小步长微调,提升整体效率。
下面是一个完整的 C++ 希尔排序实现示例:
#include#include void shellSort(std::vector
& arr) { int n = arr.size(); // 初始增量为数组长度的一半 for (int gap = n / 2; gap > 0; gap /= 2) { // 对每个子序列进行插入排序 for (int i = gap; i < n; ++i) { int temp = arr[i]; int j = i; // 在子序列中向前查找并移动元素 while (j >= gap && arr[j - gap] > temp) { arr[j] = arr[j - gap]; j -= gap; } arr[j] = temp; } } } int main() { std::vector
data = {64, 34, 25, 12, 22, 11, 90}; std::cout << "排序前: "; for (int x : data) std::cout << x << " "; std::cout << "\n"; shellSort(data); std::cout zuojiankuohaophpcnzuojiankuohaophpcn "排序后: "; for (int x : data) std::cout zuojiankuohaophpcnzuojiankuohaophpcn x zuojiankuohaophpcnzuojiankuohaophpcn " "; std::cout zuojiankuohaophpcnzuojiankuohaophpcn "\n"; return 0;
}
上述实现使用了最简单的增量序列(gap = n/2, n/4, ...),虽然直观但不是最优。可以考虑以下改进:
希尔排序是不稳定的排序算法(相同值的相对位置可能改变),但它不要求额外存储空间,属于原地排序。
基本上就这些。掌握希尔排序的关键是理解“分组插入”的思想,它为后续学习更复杂的排序算法打下基础。