• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
gaohuan30
博客园    首页    新随笔    联系   管理    订阅  订阅
希尔排序-改进的插入排序

  间隔大移动次数少,间隔小移动距离短。

public class ShellSort {
    public static void main(String[] args) {
        int[] arr = {9, 6, 11, 3, 5, 12, 8, 7, 10, 15, 14, 4, 1, 13, 2};
        sort(arr);
        print(arr);
    }

    /**
     * 希尔排序
     *
     * @param arr
     */
    private static void sort(int[] arr) {
        for (int gap = arr.length / 2; gap > 0; gap /= 2) {
            // 默认第一位排好序,从第二位开始
            for (int i = gap; i < arr.length; i++) { // 外层相当于从无序中抽牌
                for (int j = i; j > gap - 1; j -= gap) { // 遍历有序的  进行比较换位置
                    if (arr[j] < arr[j - gap]) {
                        swap(arr, j, j - gap);
                    }
                }
            }
        }
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    private static void print(int[] arr) {

        for (int i : arr) {
            System.out.print(i + " ");
        }
    }
}

  优化gap:

Knuth序列

  h = 1

  h = 3*h +1

/**
     * 希尔排序
     *
     * @param arr
     */
    private static void sort(int[] arr) {
        int h = 1;
        while (h < arr.length / 3) {
            h = h * 3 + 1;
        }
        for (int gap = h; gap > 0; gap = (gap + 1) / 3) {
            // 默认第一位排好序,从第二位开始
            for (int i = gap; i < arr.length; i++) { // 外层相当于从无序中抽牌
                for (int j = i; j > gap - 1; j -= gap) { // 遍历有序的  进行比较换位置
                    if (arr[j] < arr[j - gap]) {
                        swap(arr, j, j - gap);
                    }
                }
            }
        }
    }

  

 

posted on 2020-05-06 17:14  gaohuan30  阅读(146)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3