希尔排序

希尔排序

希尔排序是希尔(DonaldShell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含 的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
在这里插入图片描述
在这里插入图片描述
希尔排序按照步长减少排序的次数,按照步长分为不同的组,每组进行比较,然后排序,本质上还是插入排序。
一、交换法
这个交换耗费的时间比较多
具体实现如下:

 //希尔排序之交换法
   public static void shellsort(int [] arr)
   {
        //设置临时变量
       int temp=0;
       int count=0;
       //循环设置步长
       for (int gap=arr.length/2; gap>0 ;gap/=2 ) {
           //从步长开始到最后
           for (int i = gap; i <arr.length ; i++) {
                //按照步长交换
               for (int j = i-gap; j >=0 ; j-=gap) {
                    //如果前一个数大于gap步长的数交换
                   if (arr[j]>arr[j+gap])
                   {
                       //临时存储
                       temp=arr[j];
                       //交换
                       arr[j]=arr[j+gap];
                       arr[j+gap]=temp;
                   }
               }
           }
       }
   }

二、移动法
这种最接近插入排序,效率比较高
具体实现如下:

//希尔排序的移位法
   public  static void shellsort2(int [] arr)
   {
       //设置步长
       for (int gap=arr.length/2; gap>0 ; gap/=2) {
           //按照步长来分组
           for (int i = gap; i <arr.length ; i++) {
               //设置j的位置
               int j=i;
               //存储起来
               int temp=arr[j];
               //如果小于前面的交换
               if (arr[j]<arr[j-gap])
               {
                   //判断是否越界和是否小于前面的交换
                   while (j-gap>=0&&temp<arr[j-gap])
                   {
                       //交换
                       arr[j]=arr[j-gap];
                       //减掉步长
                       j-=gap;
                   }
                   //交换
                   arr[j]=temp;
           }
       }
   }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值