shellSort

2018-12-18  本文已影响8人  zh_19

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

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

先取一个正整数 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)

上一篇下一篇

猜你喜欢

热点阅读