七大排序----SevenSort(希尔排序)

希尔排序

希尔排序就是针对直接插入排序的优化

插入排序在近乎有序的数组上性能·非常好或者在小数据规模的集合中性能也很好

于是先将数组调整得近乎有序,然后使用插入排序--------希尔排序的核心思想!!!
具体操作
先选定一个整数(gap)分组(所有距离为gap的元素在同一组),对同一组元素进行排序。不断缩小这个gap的长度(gap/=2,gap/=3)重复上述分组与排序过程,当gap==1时,其实整个数组已经近乎有序了,最后再来一次全组的插入排序整个集合就变得有序了。
注意:(gap/=2,gap/=3):是经过论证得来的并不是随便写的
在这里插入图片描述

 public static void shellSort(int[] arr) {
        int gap = arr.length >> 1;
        // 当gap > 1都是分组,组内进行排序
        while (gap > 1) {
            // 组内进行插入排序
            insertionSortByGap(arr,gap);
            gap = gap >> 1;
        }
        // 当gap == 1时,其实整个数组近乎有序,整体来一次插入排序即可
        insertionSortByGap(arr,1);
    }

    private static void insertionSortByGap(int[] arr, int gap) {
        for (int i = gap; i < arr.length; i++) {
            // j和j - gap是同一组的元素,利用gap这个值来进行分组的
            for (int j = i; j - gap >= 0 && arr[j] < arr[j - gap]; j -= gap) {
                swap(arr,j,j - gap);
            }
        }
    }
     public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

希尔排序的本质:普通的插入排序,每次向前看一个元素
按照gap分组的插入排序,每次向前看gap步的元素,j-jap和j才是同一组元素
如果gap==1,就变成了普通的插入排序!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值