排序算法之希尔排序

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



平均时间复杂度 最优时间复杂度 最差时间复杂度 空间复杂度 稳定性
希尔排序 *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增量”序列...
    • 以上表格中希尔排序的数据是本博客中的采用“希尔增量”的希尔排序的时间复杂度,但这个数据为百度搜索获得,具体计算不太清楚,真实性也没法肯定
相关文章
相关标签/搜索