希爾排序是基于插入排序的以下兩點性質而提出改進方法的:
插入排序在對幾乎已經排好序的數據操作時匙姜, 效率高共虑, 即可以達到線性排序的效率
但插入排序一般來說是低效的塑猖, 因為插入排序每次只能將數據移動一位
算法思路:
先取一個正整數 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 {
// 無序區(qū)
//排序時 不是先把一組全部排序 而是按順序一個一個的排
for i in h..<count {
var insert = i
let value = self[i]
// 有序區(qū)
while insert > h - 1 && self[insert - h] >= value {
self[insert] = self[insert - h]
insert -= h
}
self[insert] = value
debugPrint("-===-=-=-=-\(self)")
}
h = h / 2
}
}
}