排序算法-希尔排序
希尔排序(升序为例)
希尔排序的思想:将序列看成一个矩阵,根据一个步长序列将原序列分成m个列,逐列进行排序,直到列数变为1列为止
因此希尔排序的时间复杂度与步长关系密切。
希尔本人给出的步长序列为: n / (2^k),其中n为序列元素的个数,k >= 1,取整数
举例: 序列元素有32个,那步长序列为 [1, 2, 4, 8, 16],在进行希尔算法时,按步长从大到时小,先分成16列,再8列....最后分成一列,即完成排序
class ShellSort { var array = [5, 7, 2, 8, 9, 4, 7, 3, 2] var shellSteps: [Int] init() { shellSteps = Array<Int>() shellSteps = shellStep() } // 获取希尔步长序列 func shellStep() -> [Int] { var steps = [Int]() var count = array.count >> 1 while count > 0 { steps.append(count) count = (count >> 1) } return steps } func sort() { for step in shellSteps { sort(step: step) } } func sort(step: Int) { for col in 0 ..< step { for begin in stride(from: col + step, to: array.count, by: step) { var current = begin while current > col, array[current] < array[current - step] { let tmp = array[current] array[current] = array[current - step] array[current - step] = tmp current -= step } } } } }
* 最好时间复杂度为: O(n),希尔步长序列的最坏时间复杂度为:O(n^2)
* 空间复杂度为: O(1)
* 稳定性: 不稳定排序
相关推荐
troysps 2020-07-19
路漫 2020-06-16
wonner 2020-06-04
wulaxiaohei 2020-06-05
wonner 2020-06-03
清溪算法君老号 2020-06-01
Joymine 2020-06-16
数据与算法之美 2020-05-27
sunjunior 2020-05-28
randy0 2020-11-17
lixiaotao 2020-10-07
美丽的泡沫 2020-09-08
nongfusanquan0 2020-08-18
hang0 2020-08-16
earthhouge 2020-08-15
算法改变人生 2020-07-28
Broadview 2020-07-19