Shell排序

本文深入探讨了Shell排序算法,一种高效的插入排序变种。通过逐步减小增量将数据集划分为多个子序列进行排序,最终合并为一个有序的整体。文章详细介绍了算法的实现过程及时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.accp;

public class Shell {
 /*Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点:
 1)当数据规模小的时候非常高效
 2)当给定数据已经有序时的时间代价为O(N)
 所以,Shell排序每次把数据分成若个小块,来使用插入排序,而且之后在这若个小块排好序的情况下把它们合成大一点的小块,继续使用插入排序,不停的合并小块,知道最后成一个块,并使用插入排序。

 这里每次分成若干小块是通过“增量” 来控制的,开始时增量交大,接近N/2,从而使得分割出来接近N/2个小块,逐渐的减小“增量“最终到减小到1。

 一直较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)
 所以我在实现Shell排序的时候采用该增量序列*/

 /**
  * @author yovn
  */
 public class ShellSorter<E extends Comparable<E>> extends Sorter<E>  {

     /* (non-Javadoc)
      * Our delta value choose 2^k-1,2^(k-1)-1,.7,3,1.
      * complexity is O(n^1.5)
      * @see algorithms.Sorter#sort(E[], int, int)
      */
     @Override
     public void sort(E[] array, int from, int len) {
        
         //1.calculate  the first delta value;
         int value=1;
         while((value+1)*2<len)
         {
             value=(value+1)*2-1;
        
         }
    
         for(int delta=value;delta>=1;delta=(delta+1)/2-1)
         {
             for(int i=0;i<delta;i++)
             {
                 modify_insert_sort(array,from+i,len-i,delta);
             }
         }

     }
    
     private final  void modify_insert_sort(E[] array, int from, int len,int delta) {
           if(len<=1)return;
           E tmp=null;
           for(int i=from+delta;i<from+len;i+=delta)
           {
               tmp=array[i];
               int j=i;
               for(;j>from;j-=delta)
               {
                   if(tmp.compareTo(array[j-delta])<0)
                   {
                       array[j]=array[j-delta];
                   }
                   else break;
               }
               array[j]=tmp;
           }

     }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值