您好我正在尝试学习shell排序。我理解分割成段并使用插入方法进行排序的基本原则。
但是我只理解这个我发现的代码示例。如果有人能给我一个清楚的解释,每个for循环做什么等等都会很棒。
int const size = 5;
int i, j, increment, temp;
int array[size]={4,5,2,3,6},i1=0;
//split the array into segments unil we reach beginning of array
for(increment = size/2;increment > 0; increment /= 2)
{
for(i = increment; i<size; i++)
{
temp = array[i];
for(j = i; j >= increment ;j-=increment)
{
//perform the insertion sort for this section
if(temp < array[j-increment])
{
array[j] = array[j-increment];
}
else
{
break;
}
}
array[j] = temp;
}
}
答案 0 :(得分:3)
for(increment = size/2;increment > 0; increment /= 2)
此for循环初始化您要比较的数组中元素之间的差距。因此,最初将增量设置为2。
for(i = increment; i<size; i++)
{
temp = array[i];
这就是说,从元素3开始向前走,直到你到达元素5,我们很快就会明白为什么。
for(j = i; j >= increment ;j-=increment)
{
//perform the insertion sort for this section
if(temp < array[j-increment])
{
array[j] = array[j-increment];
}
else
{
break;
}
}
array[j] = temp;
说好的,我们从上面指定的元素开始(在这种情况下,第二个索引),我们将把它与&#34; gap&#34;的元素进行比较。它背后的长度。所以它需要第3个元素,并将它与第1个元素进行比较。如果第三元素小于 第一元素,则交换它们,否则会退出循环。然后我们通过间隙的大小(从2到0)递减我们的指数,并且如果我们的新指数至少与间隙的大小一样大,那么继续下去(因此我们不会有数组超出范围的问题) 。
现在我们回到中间for循环并增加我们开始的元素位置;所以我们比较
一旦我们比较了他们的差距和#34;长度,我们返回并将间隙长度改为之前的一半,冲洗并重复,直至达到0.
通常情况下,您不希望将差距分成两半 - 有预先定义的间隙长度推荐函数(通常是质数)。 See wikipedia了解更多信息。