【正确答案】(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排序算法快。
【答案解析】