希尔排序与普通插入排序

普通插入排序:

将n个元素看成一个有序列表和一个无序列表,将无序列表中的数据插入到有序列表中。

 public static void insertSort(int[] arr){
        int insertIndex=0;
        int inserValue=0;
        //使用for循环完成
        for (int i = 1; i < arr.length; i++) {//从索引为1处开始,直到最后一个
            //首先定义需要插入的数的索引
            insertIndex = i ; // 即arr[1]的前面这个数的下标
            inserValue=arr[i];//待插入的数值

           //!!!!!注意能在while循环条件判断()里面加判断条件,就加。
            //!!!! 如果在while循环里面多添加一个if判断,  两者时间相差很大
           while (insertIndex-1>=0 && arr[insertIndex-1]>inserValue){
                  //此时不是交换,而是移位
                   arr[insertIndex]=arr[insertIndex-1];
                     insertIndex--;
           }
           //优化
              if (insertIndex!=i) {//insertIndex值没有改变过
                arr[insertIndex] = inserValue;
            }

        }

希尔排序,也叫缩小增量排序。缩小的是带插入元素与前面第几个位置之间的下标差。

 public static void shelltSort(int[] arr){
        int insertIndex=0;
        int inserValue=0;
//注意这里就是来缩小增量了,通过引入步长来改变
//步长开始为数组长度/2;后面不断/2,找到step=0,跳出循环
      for(int step=arr.length/2;step>0;step/=2){
        //使用for循环完成
//注意此时的i不再等于1,而是等于step
        for (int i = step; i < arr.length; i++) {//从索引为step处开始,直到最后一个
            //首先定义需要插入的数的索引
            insertIndex = i ; // 即arr[1]的前面这个数的下标
            inserValue=arr[i];//待插入的数值

           //!!!!!注意能在while循环条件判断()里面加判断条件,就加。
            //!!!! 如果在while循环里面多添加一个if判断,  两者时间相差很大
           while (insertIndex-step>=0 && arr[insertIndex-step]>inserValue){
                  //此时不是交换,而是移位
                   arr[insertIndex]=arr[insertIndex-step];
                     insertIndex-=step;
           }
           //优化
              if (insertIndex!=i) {//insertIndex值没有改变过
                arr[insertIndex] = inserValue;
            }

        }
    }

速度测试:

创建要给80000个的随机的数组,分别进行插入和希尔排序

希尔排序要明显由于插入排序。 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值