了解C++Shell排序

Understanding a C++ Shell sort

本文关键字:排序 C++Shell 了解      更新时间:2023-10-16

嗨,我正在学习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;
    }
}
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;

好吧,我们从上面指定的元素开始(在这种情况下,是第二个索引),我们将它与后面的"间隙"长度的元素进行比较。因此,它将取第三个元素,并将其与第一个元素进行比较。如果第三个元素第一个则交换它们,否则中断循环。然后,我们将我们的索引减少间隙的大小(从2到0),如果我们的新索引至少与间隙的大小一样大,则继续进行(这样我们就不会出现数组越界问题)。

现在我们回到循环的中间,增加我们开始的元素位置;所以我们比较

  • 第4个元件对第2个元件。停止
  • 第五元素对第三元素,然后第三元素对第一元素。停止

一旦我们比较了它们"间隙"长度内的所有元素,我们就返回并将间隙长度更改为以前的一半,冲洗并重复,直到达到0。

通常,你不想只把间隙一分为二——有预定义的间隙长度推荐函数(通常是素数)。有关更多信息,请参阅维基百科。