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;
}
}
}
}
在这个
shellsort()
函数中,我们使用了j-=gap
。假设n=10
,间隔始终为5
,而且j
从0,1,2,3,4...
递增。这意味着在这个内部的
for
循环运行的前5次中,它将向j
返回一个负值(例如:0-5=-5
),因此由于j
不会大于或等于0
,它只会运行一次。这个方法之所以奏效,是因为这正是我们想要的。我们不希望进行多次交换,因为如果这样做,我们只会反复交换同两个值,从而造成不必要的冗余。
所以,我在想为什么我们不能在循环中省略
j-=gap
,因为它似乎并没有影响到功能。是否有特殊原因包含j-=gap
?我在这里漏掉了什么吗?