美文网首页
2.希尔排序

2.希尔排序

作者: 世界是一个圆_ | 来源:发表于2018-06-21 22:38 被阅读0次
1.什么是希尔排序

对于大规模的乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点的从一端移动到另一端。例如最小的数在数组的末尾,那么它需要移动N-1次。
希尔排序为了加快速度简单的改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入的排序将局部有限的数组排序。

  • h有序数组
    数组中任意间隔为h的元素都是有序的,则该数组成为h有序数组。

一个h有序数组就是由h个互相独立的有序数组编织在一起组成的数组,如下图所示:


h有序数组.png

希尔排序的思想就是使随机数组成为h有序数组,这样当h很大时,我们就能将元素移动到很远的地方。h由大变小,最终变为1,这样对于任意以1结尾的h序列,我们都能将数组排序,这就是希尔排序。

2.实现

下面的代码实现了从N/3开始递减到1的希尔排序。

 public static void shellSort(int[] a) {
        int n = a.length;
        // 3x+1 increment sequence:  1, 4, 13, 40, 121, 364, 1093, ... 
        int h = 1;
      
        while (h < n/3) h = 3*h + 1; 

        while (h >= 1) {
            // 将数组变为h有序
            for (int i = h; i < n; i++) {
                //将a[i] 插入到a[i-h],a[i - 2*h],a[i - 3*h]....
                for (int j = i; j >= h && less(a[j], a[j-h]); j -= h) {
                    exch(a, j, j-h);
                }
            }
            assert isHsorted(a, h); 
            h /= 3;
        }
        assert isSorted(a);
    }
希尔排序轨迹图.png

上面的实现方法其实就是将普通插入排序的1变为了递减的h。

相关文章

  • [算法导论]-第七章-快速排序

    本章重点 1.快速排序 2.冒泡排序 3.希尔排序 1.快速排序 2.冒泡排序 3.希尔排序 希尔排序,也称递减增...

  • 常见的排序算法(1)

    要点 冒泡排序 选择排序 插入排序 希尔排序 1. 冒泡排序 2.选择排序 3. 插入排序 4.希尔排序

  • 2.希尔排序

    1.什么是希尔排序 对于大规模的乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点的从一端移动到...

  • 2.希尔排序

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

  • 算法(二)--排序

    1. 选择排序: 2. 插入排序 3. 希尔排序

  • 排序补充

    1.插入排序 2.希尔排序 3.选择排序

  • 插入类排序算法-直接插入排序、希尔排序

    1.直接插入排序 2.希尔排序

  • 排序算法----常见的排序算法

    1.冒泡排序 2.简单选择排序 3.直接插入排序 4.快速排序 快速排序 5.堆排序 堆排序 6.希尔排序 希尔排...

  • Python排序方法

    1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.快速排序

  • 排序算法(二)之希尔排序

    图解排序算法(二)之希尔排序 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也...

网友评论

      本文标题:2.希尔排序

      本文链接:https://www.haomeiwen.com/subject/cpxhyftx.html