数据结构note8:希尔排序

/**
 * instruction of project
 *
 * @author Aruiea.com
 * @ClassName ShellSort
 * @Version 1.0
 * @Date 2020/7/31 9:29
 * 希尔排序是在插入排序上的拓展:主要解决
 * 思路如下:
 * 在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
 * 然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。
 *  比如:length=13,假设间隔取k=5.则数据序列下标是:{0,5,10},{1,6,11},{2,7,12},{3,8}{4,9}一共k个序列,再对他们进行插入排序。
 *  然后把间隔k减少。
 *  直到间隔为1。
 */
public class ShellSort {

    public static void main(String[] args) {
        int[] arr ={10,9,8,7,6,5,4,3,2,1};
        shell_sort( arr,arr.length);

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

    public static void shell_sort(int array[],int lenth){
        //希尔排序
        int gap = array.length;
        while (true) {
            gap /= 2;   //增量每次减半

            for (int i = 0; i < gap; i++) {//每一个序列的起始元素从0到间隔-1,代表共有多少组序列
                for (int j = i + gap; j < array.length; j += gap) {//这个循环里其实就是一个插入排序
                    //第一个元素默认有序,所以j从第二个元素i+gap开始。
                    int temp = array[j];
                    int k = j - gap;//由于j=i+gap,j=j-gap最多为0,用其他可能出现数组下标越界。
                    while (k >= 0 && array[k] > temp) {
                        array[k + gap] = array[k];
                        k -= gap;
                    }
                    array[k + gap] = temp;
                }
            }

            if (gap == 1)
                break;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值