书中给出了一个shell排序算法的程序
void shellsort(int V[], int n)
{
int gap, i, j, temp;
for (gap = n/2; gap > 0; gap /= 2)
for (i = gap; i < n; i++)
for (j = i-gap; j>=0 && V[j]>V[j+gap]; j -= gap) {
temp = V[j];
V[j] = V[j+gap];
V[j+gap] = temp;
}
}
恕我愚钝,我至今还没有完全弄明白它是怎么搞的。一般人的shell排序算法写不了这么简洁。
这个程序也让我感想颇多,大牛有时候是不一定会考虑小白们的感受的,就好比有时候数学书上的一句“显然……”,就可能难倒一大片学生。不光是中国人喜欢简洁、漂亮的东西(比如同济的《高等数学》,其实那本书写的很不错),国外的人也一样。但是国外的入门书籍一般都会煞费苦心的萝莉啰嗦的讲很多东西,国内的很多书可没有这个耐心。
书里面有个习题很有意思,就是将数字转化为对应的字符串:void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* record sign */
n = -n; /* make n positive */
i = 0;
do { /* generate digits in reverse order */
s[i++] = n % 10 + '0'; /* get next digit */
} while ((n /= 10) > 0); /* delete it */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
#define abs(x) ((x)<0 ? -(x):(x))
void reverse(char s[])
{
int c, i , j;
for(i = 0, j = strlen(s)-1;i < j;i++,j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
void itoa(int n, char s[])
{
int i ,sign;
sign = n;
i = 0;
do
{
s[i++] = abs(n % 10) + '0';
}while((n /= 10) != 0);
if(sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}