1 排序思想
① 先取一个正整数d1(d1<n)作为第一个增量,将全部n个记录分成d1组,把所有相隔d1的记录放在一组中,即对于每个k(k=1, 2, … d1),R[k], R[d1+k], R[2d1+k] , …分在同一组中,在各组内进行直接插入排序。这样一次分组和排序过程称为一趟希尔排序;
② 取新的增量d2<d1,重复①的分组和排序操作;直至所取的增量di=1为止,即所有记录放进一个组中排序为止。
#include <stdio.h>
int gnum=0;
void shellsort(int arry[],int n);
void print(int *iarry,int n,int i){
for ( int j=0;j<n;j++)
{
printf("%d ",iarry[j]);
}
printf("\n");
}
void shellinsertsort(int arry[],int n,int dk){
for ( int inum = dk;inum < n ;inum ++ ){
if ( arry[inum] < arry[inum - dk] )
{
int j = inum-dk;
int x = arry[inum];
while ( x < arry[j] )
{
arry[j+dk] = arry[j];
j -= dk;
if ( j < 0 )
break;
gnum++;
}
arry[j+dk] = x;
}
print(arry,10,10);
}
}
void shellsort(int arry[],int n){
int dk = n/2;
while(dk >=1){
printf("%d \n",dk);
shellinsertsort(arry,n,dk);
dk = dk/2;
}
}
int main(){
int iarry[10]={8,1,4,9,5,3,6,7,2,0};
shellsort(iarry,10);
print(iarry,10,10);
printf(" gnum : %d\n",gnum);
return 0;
}
对比上篇的直接插入排序:计算其循环次数
次数统计有误,请勿当真!