实现原理

使数组中任意间隔为h的元素都是有序的。然后缩减h再次进行排序,最后缩减到1

效率分析

数学上无法确定希尔排序需要的平均比较次数,最坏情况下是N,达不到平方的级别。希尔排序的代码量很少,且不需要额外的内存空间。在嵌入式平台上比较常用。

代码实现

  1. func sort(a []int) {
  2. N := len(a)
  3. h := 1
  4. for h < N / 3 {
  5. h = 3 * h + 1
  6. }
  7. for h >= 1 {
  8. for i := h; i < N; i++ {
  9. // a[i], a[i-h], a[i-2*h]... 做插入排序
  10. for j := i; j >= h && less(a[j], a[j - h]); j -= h {
  11. exch(a, j, j - h)
  12. }
  13. }
  14. h = h / 3
  15. }
  16. }