了解C ++ Shell排序

时间:2013-12-16 20:13:14

标签: c++ algorithm sorting

您好我正在尝试学习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;
    }
}

1 个答案:

答案 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循环并增加我们开始的元素位置;所以我们比较

  • 第二个元素的第4个元素。停止
  • 第3个元素与第3个元素,然后是第3个元素与第1个元素。停止

一旦我们比较了他们的差距和#34;长度,我们返回并将间隙长度改为之前的一半,冲洗并重复,直至达到0.

通常情况下,您不希望将差距分成两半 - 有预先定义的间隙长度推荐函数(通常是质数)。 See wikipedia了解更多信息。