排序算法之希尔排序

这里是传送门⇒总结:关于排序算法



平均时间复杂度 最优时间复杂度 最差时间复杂度 空间复杂度 稳定性
希尔排序 *O(n1.3) *O(n) *O(n2) O(1) 不稳定


希尔排序是直接插入排序的改进版本。直接插入排序每次只能让数据移动一位,而希尔排序是通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,所以希尔排序又称“缩小增量排序”

  • 算法描述
    • 把待排序列按照一定“增量”分组,对每一组都采用直接插入排序
    • 移动位数可达给定“增量”
    • 渐减“增量”至1时,整个待排序列为1组,结束(常见为减半“增量”,称“希尔增量”)
  • JS实现
// 此处传入发array会被直接改变
function ShellSort(array) {
    var len = array.length;
    for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
        for (var i = gap; i < len; i++) {
            var temp = array[i];
            for (var j = i; j >= gap && temp < array[j - gap]; j -= gap) {
                array[j] = array[j - gap];
            }
            array[j] = temp;
        }
    }
}
  • 分析
    • 一开始“增量”较大,每一组的元素较少,排序速度快;随着“增量”渐减,每一组的元素渐增,但每一组的前面大多元素基本有序,所以排序的速度仍然很快
    • 虽然直接插入排序是稳定的,但由于分了组,相同的元素可能在各自的分组排序中移动,所以希尔排序是不稳定的
    • “希尔增量”序列并不是最优的增量序列
    • 还有“Hibbard增量”序列、“Knuth增量”序列、“Sedgewick增量”序列...
    • 以上表格中希尔排序的数据是本博客中的采用“希尔增量”的希尔排序的时间复杂度,但这个数据为百度搜索得到,具体计算不太清楚,真实性也无法确定
posted @ 2021-02-23 21:56  有机物与鱼  阅读(31)  评论(0编辑  收藏  举报