希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
算法思路:
先取一个正整数 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
}
}
}
网友评论