希尔排序~

希尔排序是将系列根据小标增量分组,增量是一个递减的,直到增量为1 就是原始的直接插入排序

int[] data = {0,5,4,8,9,3,2,67,23};

len = 8 

1、取增量increment = len /2 = 4

data[0]    data[4]   data[8]   为一组

data[1]    data[5]    为一组

data[2]    data[6]    为一组

。。。。。

每组排序完,将增量较小,继续分组

2、取增量increment /= 2 ,得到increment = 2;

。。。。。

对下面插入排序,下标对应修改,不然真的伤神,估计也很难搞出希尔排序;

改为希尔排序发现之前写的直接插入排序掉了一个逻辑判断

if(i == 0) data[i]=insert_data;
            /*
            for(int start_index = 1;start_index <= len -1;start_index++){
                int insert_data = data[start_index];
                for(int i = start_index -1;i >=0;i--){
                    if(data[i]>insert_data){
                        data[i+1]=data[i];
                    }else{
                        data[i+1]=insert_data;
                        break;
                    }
                    if(i == 1) data[i]=insert_data;
                }
            }*/

修改下表后希尔排序


        int[] data = {0,5,4,8,9,3,2,67,23};
        int len = data.length;

        for(int incrment = len/2;incrment >=1;incrment/=2){

            for(int j =0;j<incrment;j++){
                for(int start_index = j+incrment;start_index<=len-1;start_index+=incrment){
                    int insert_data = data[start_index];

                    for(int k = start_index-incrment;k >=j;k-=incrment){
                        if(data[k]>insert_data){
                            data[k+incrment]=data[k];
                        }else{
                            data[k+incrment]=insert_data;
                            break;
                        }

                        if(j==k) data[k]=insert_data;
                    }
                }
            }

            /*
            for(int start_index = 1;start_index <= len -1;start_index++){
                int insert_data = data[start_index];
                for(int i = start_index -1;i >=0;i--){
                    if(data[i]>insert_data){
                        data[i+1]=data[i];
                    }else{
                        data[i+1]=insert_data;
                        break;
                    }
                    if(i == 1) data[i]=insert_data;
                }
            }*/

        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值