排序算法的详细介绍(六) -- 希尔排序

Posted by Srefan on February 4, 2017

常见排序算法归档介绍:

排序算法的详细介绍(一) – 插入排序
排序算法的详细介绍(二) – 冒泡排序
排序算法的详细介绍(三) – 快速排序
排序算法的详细介绍(四) – 选择排序
排序算法的详细介绍(五) – 堆排序
排序算法的详细介绍(六) – 希尔排序
排序算法的详细介绍(七) – 归并排序
排序算法的详细介绍(八) – 鸡尾酒排序
排序算法的详细介绍(九) – 猴子排序
排序算法的详细介绍(十) – 桶排序
排序算法的详细介绍(十一) – 基数排序


希尔排序 Shell Sort

算法描述

  1. 先取一个正整数 d1(d1 < n),把全部记录分成 d1 个组,所有距离为 d1 的倍数的记录看成一组,然后在各组内进行插入排序.
  2. 然后取 d2(d2 < d1).
  3. 重复上述分组和排序操作;直到取 di = 1(i >= 1) 位置,即所有记录成为一个组,最后对这个组进行插入排序.
  4. 一般选 d1 约为 n/2, d2 为 d1 /2, d3 为 d2/2 ,…, di = 1.

shell_sort_animation

实例分析

  • 数组: [80, 93, 60, 12, 42, 30, 68, 85, 10], 排序过程:

  • 首先取 d1 = 4, 将数组分为 4 组, 如下图中相同颜色代表一组: shell_sort_step1

  • 然后分别对 4 个小组进行插入排序, 排序后的结果为: shell_sort_step2

  • 然后,取 d2 = 2, 将原数组分为 2 小组: shell_sort_step3

  • 然后分别对 2 个小组进行插入排序, 排序后的结果为: shell_sort_step4

  • 最后, 取 d3 = 1, 进行插入排序后得到最终结果: shell_sort_step5

代码实现

function shellSort(array) {
    function swap(array, i, k) {
        var temp = array[i];
        array[i] = array[k];
        array[k] = temp;
    }
    var length = array.length,
        gap = Math.floor(length / 2);
    while (gap > 0) {
        for (var i = gap; i < length; i++) {
            for (var j = i; 0 < j; j -= gap) {
                if (array[j - gap] > array[j]) {
                    swap(array, j - gap, j);
                } else {
                    break;
                }
            }
        }
        gap = Math.floor(gap / 2);
    }
    return array;
}

此文参考于 bubkoo.com,十分感谢.
所有引用内容版权归原作者所有.
使用 知识共享“署名-非商业性使用-相同方式共享 3.0 中国大陆”许可协议 授权.