原理

  • 插入排序的一种改进版本
  • 步骤

    • 将待排序序列分为若干子序列(每个子序列的元素在原始数组中间距相同)
    • 对这些子序列进行插入排序
    • 减小每个子序列中元素之间的间距,重复上述过程直至间距减少为1

      性质

  • 稳定性 : 不稳定

  • 时间复杂度
    • 最优:希尔排序 - 图1
    • 平均和最坏与间距序列的选取有关,已知最好的最坏时间复杂度为希尔排序 - 图2

      代码

      1. public void shell_sort(int[] a) {
      2. int h = 1;
      3. while (h < a.length / 3) {
      4. h = 3 * h + 1;
      5. }
      6. while (h >= 1) {
      7. for (int i = h; i < a.length; i++) {
      8. int key = a[i];
      9. int j = i - h;
      10. while (j >= 0 && a[j] > key) {
      11. a[j + h] = a[j];
      12. j = j - h;
      13. }
      14. a[j + h] = key;
      15. }
      16. h = h / 3;
      17. }
      18. }