shellSort

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
算法思路:

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

extension Array where Element: Comparable {
        mutating func shellSort() {
        var h = 1
        while h < count / 2 {
            h = h * 2
        }
        while h >= 1 {
            // 无序区
          //排序时 不是先把一组全部排序  而是按顺序一个一个的排
            for i in h..<count {
                var insert = i
                let value = self[i]
                // 有序区
                while insert > h - 1 && self[insert - h] >= value {
                    self[insert] = self[insert - h]
                    insert -= h
                }
                self[insert] = value
                debugPrint("-===-=-=-=-\(self)")
            }
            h = h / 2 
        }
    }
}

参考

常见排序算法 - 希尔排序 (Shell Sort)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外...
    文哥的学习日记阅读 1,064评论 2 10
  • 一、对比分析图 均按从小到大排列 k代表数值中的"数位"个数 n代表数据规模 m代表数据的最大值减最小值 稳定性:...
    leo567阅读 1,258评论 0 1
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,290评论 0 2
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,753评论 0 15
  • 京南小雨细如遮 小窗残月 星隐云郭 何人知我是梦来 一番思绪 两种言说 花开总知花会落 新年春草 又见黄棵 身背矢...
    foxmuldersu阅读 221评论 0 1