结构推理 使用不同的增量来研究Shell排序算法,并与下列“增量除以2”的排序函数比较。请特别试一下“增量除以3”的方法,该方法对长度为n的序列以n/3,n/9…为增量。
   void shellsort(Sortobject*pvector){    /*Shell sort*/
       int incr,start;
       for (incr=pvector->n/2;incr>0;incr/=2)  /*for each increment*/
           for(start=0;start<incr;start++)    /*Sort each sublist*/
               inssort2(pvector,start,incr);
   }
   /*Modified version of Insertion Sort for varying increments*/
   void inssort2(SortObject*pvector,int start,int incr){
       int i,j;
       RecordNode temp;
       for(i=start+incr;i<pvector->n;i+=incr){
           temp==pvector->record[i];
           for(j=i;(j>=incr)&&(temp.key<pvector->record[j-incr].key);j-=incr)
               pvector->record[j]=pvector->record[j-incr];
           pvector->record[j]=temp;
       }
   }
【正确答案】(1)增量除以3的算法
   void shellsort3(Sortobject*pvector){    /*Shell sort*/
       int incr,start;
       for(incr=pvector->n/3;incr>1;incr/=3)  /*for each increment*/
           for(start=0;start<incr;start++1    /*Sort each sublist*/
               inssort2(pvector,start,incr);
       inssort2(pvector,0,1);
   }
   修改上述算法,使得在排序的同时,统计比较次数和移动次数:
   定义两个全局变量compare和move,记录比较次数和移动次数。只需修改函数inssort2即可。修改后的函数如下。
   void inssort2(SortObject*pvector,int start,int incr){
       int i,j;
       RecordNode temp;
       for(i=start+incr;i<pvector->n;i+=incr){
           temp=pvector->record[i];
           move+=1:
           for(j=i;0>=incr)&&(temp.key<pvector->record[j-incr].key);j-=incr){
               pvector->record[j]=pvector->record[j-incr];
               move+=1;
               compare+=1;
           }
           if(j>0)
               compare+=1;
           pvector->record[j]=temp;
           move+=1:
       }
   }
   (2)调试结果
   对于上述初始值{15,23,45,61,54,12,51,4,48,1,9,57,8,5,21,84,67,56,13,34},用增量为2的Shell排序,比较93次,移动158次;用增量为3的Shell排序,比较91次,移动144次。
   换一组初始值{64,24,54,1,6,64,54,31,84,34,64,4,34,54,37,48,57,61,0,65},用增量为2的shell排序,比较92次,移动1 59次;用增量为3的Shell排序,比较80次,移动134次。
   再换一组初始值{97,31,57,64,34,71,59,72,16,58,42,34,95,1,73,56,98,38,16,82},用增量为2的Shell排序,比较98次,移动165次;用增量为3的Shell排序,比较86次,移动140次。
   通过多次试验,发现用增量为3的shell排序算法在多数情况下比增量为2的shell排序算法快。
【答案解析】