【发布时间】:2015-08-20 07:04:51
【问题描述】:
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不会大于或等于@987654332 @,它只会运行一次。
之所以有效,是因为这正是我们想要的。我们不想多次交换,因为如果这样做,我们只会再次交换相同的两个值,从而导致不必要的冗余。
所以,我在想为什么我们不能在循环中省略 j-=gap,因为它似乎根本不会影响功能。包含j-=gap有什么特殊原因吗?
我错过了什么吗?
【问题讨论】:
-
最终,
gap缩小为1。您需要多次重复内部循环。
标签: c algorithm sorting shellsort