vlambda博客
学习文章列表

排序算法-Sort,更高效率的插入排序—希尔排序

基本思想:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时再对全体记录进行一次直接插入排序。

子序列的构成不是简单的“逐段分割”,而是将相隔某个增量的记录组成一个子序列。对于这个“某个增量",初始时通常取k=n/2,然后依次取k=k/2,直至k为1表明最后一次会对整体记录进行一次直接插入排序



代码

比直接插入排序多了一个外层循环,思想可类比。
void shell_sort(int a[], int n){ int i,j,k, key; k = n / 2; while (k >= 1) { for (i = k; i < n; i++) //插入排序时,两个比较元素之间距离k { //在简单插入排序中两个比较元素距离为1 key = a[i]; j = i - k; while (key < a[j] && j >= 0) { a[j + k] = a[j]; j -= k; } a[j + k] = key; } k /= 2; }}

性能分析

时间复杂度
空间复杂度
稳定性
复杂性
平均
最坏
最好
O(nlogn)~O(n^2)
O(nlogn)~O(n^2)
O(1)
不稳定 较复杂
一般情况下希尔排序优于直接插入排序,但复杂度分析复杂,适合中等数据量大小的排序(上万的数据量),另外要注意希尔排序不稳定!