了解C++Shell排序
Understanding a C++ Shell sort
嗨,我正在学习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。
通常,你不想只把间隙一分为二——有预定义的间隙长度推荐函数(通常是素数)。有关更多信息,请参阅维基百科。
相关文章:
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 如何通过cpp程序运行shell脚本
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- shell排序中的交换和比较
- 使用 c++ 中的线程进行 shell 排序
- 在C 中实现Shell排序序列
- 了解C++Shell排序
- 实现基于迭代器的 shell 排序
- shell将伪代码排序为c++代码