数据结构----希尔排序
一、基本思想希尔排序又称缩小增量排序是直接插入排序的改进版。核心思路先把整个数组按下标分成若干组每组间隔为 增量 d对每一组内部分别做直接插入排序逐步缩小增量 d重复分组、组内插入排序最后一趟增量 d 1退化成普通直接插入排序此时数组已基本有序排序极快。一句话总结先宏观粗略有序再微观精细插入。二、为什么比直接插入快直接插入在逆序、乱序时元素移动次数非常多希尔排序一开始远距离交换把小元素快速挪到前面、大元素挪到后面后期数组接近有序直接插入效率极高。三、增量选取规则四、算法执行步骤设定初始增量 dn/2按间隔 d 分组下标 0,d,2d... 一组1,d1,2d1... 一组每组内部进行直接插入排序增量减半 dd/2重复分组排序当 d1完成最后一趟直接插入整体有序。五、完整 C 语言代码#include stdio.h // 希尔排序 void ShellSort(int a[], int n) { int i, j, temp; // 增量d 初始n/2每次折半缩小 for(int d n / 2; d 0; d d / 2) { // 组内直接插入排序 for(i d; i n; i) { temp a[i]; // 同组向前比较间隔为d for(j i - d; j 0 a[j] temp; j - d) { a[j d] a[j]; } a[j d] temp; } } } // 打印数组 void Print(int a[], int n) { for(int i 0; i n; i) printf(%d , a[i]); printf(\n); } int main() { int arr[] {49, 38, 65, 97, 76, 13, 27, 49}; int len sizeof(arr) / sizeof(arr[0]); ShellSort(arr, len); Print(arr, len); return 0; }六、代码逐行解析for(int d n/2; d 0; d d/2)控制增量变化初始折半逐次折半直到 d1。for(i d; i n; i)从第 d 个元素开始逐个处理每组元素。temp a[i]暂存当前要插入的元素。for(j i-d; j 0 a[j] temp; j - d)j i-d同组前一个元素j - d继续向前找同组前驱比 temp 大的元素向后挪 d 个位置a[j d] temp找到合适位置插入元素。七、性能分析时间复杂度最坏O(n 2)平均O(n 1.3)左右优于直接插入、冒泡、简单选择。空间复杂度仅常数变量O(1)就地排序稳定性不稳定排序远距离分组交换会打乱相等元素相对位置。八、四大特点必背属于插入类排序先分组粗排后精细插入不稳定、就地排序越乱序的数据提升效果越明显接近有序时优势变小。九、插入类排序总结直接插入简单、稳定、O(n 2)折半插入减少比较次数、仍 O(n 2 )、稳定希尔排序分组增量优化、O(n 1.3)、不稳定