C++ 试图理解shell排序

C++ 试图理解shell排序,c++,sorting,C++,Sorting,我想了解我在网上找到的一种贝壳。代码如下: 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

我想了解我在网上找到的一种贝壳。代码如下:

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(增量=大小/2;增量>0;增量/=2)
{
对于(i=增量;i=增量;j-=增量)
{
//执行此节的插入排序
if(温度<阵列[j增量])
{
数组[j]=数组[j-增量];
}
其他的
{
打破
}
}
数组[j]=温度;
}
}
我知道第一个循环一直将数组中的元素数除以2,直到达到1为止。但是我并不真正理解代码的其余部分。

首先,请仔细阅读

最里面的循环执行插入排序的一部分,将元素插入到起始点“左侧”的(可能是)已排序的子数组中,但仅将元素视为间隔的倍数。第二个循环(
for(i=…
)执行插入排序的另一半,在数组中前进;当此循环完成时,整个数组被排序,但仅在没有元素被
interval
的倍数分隔的意义上。也就是说,没有
i
k
这样的数组[i]>array[i+k*interval]

最外层的循环通过越来越小的间隔进行迭代,直到它对整个数组进行“完全”插入排序


我认为从大间隔开始的想法是通过允许非常大或非常小的元素“跳跃”来加速整个排序数组的较大部分,而不是在每个位置上爬行;其工作情况并不明显…

将其放入调试器,逐步完成代码,并使用watch查看各种变量的值,以了解其工作情况:-)并使用一个非常小的文件(5行?)和1个副本作为测试数据。