shellSort

作者: zh_19 | 来源:发表于2018-12-18 11:48 被阅读8次

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

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

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

    相关文章

      网友评论

          本文标题:shellSort

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