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...
增加。在C中實現shellort算法
這意味着該內for
循環運行的前5次,將一個負的值返回到j
(例如0-5=-5
),因此,因爲j
不會大於或等於0
,它將只運行一次。
它的工作原理正是我們想要的。我們不想多次交換,因爲如果我們這樣做了,我們只會再次交換相同的兩個值,從而導致不必要的冗餘。
所以,我在想,爲什麼我們不能在循環中忽略j-=gap
,因爲它似乎並不影響功能。包含j-=gap
是否有特殊原因?
我在這裏錯過了什麼嗎?
最終'gap'縮小到'1'。您需要多次重複內部循環。 –