我在尝试用c ++编写梳子排序时遇到了问题。我看不出我做错了什么,它只是没有对列表进行排序。
void comb()
{
int gap = 9;
int temp;
double shrink = 1.3;
bool swapped;
do
{
gap = int (gap/shrink);
if (gap < 1)
{
gap = 1;
}
swapped = false;
for (i = 0; (i + gap) <= 10; i++)
{
if (list[i] > list[i + gap])
{
temp = list[i];
list[i] = list[i + gap];
list[i + gap] = temp;
swapped = true;
}
}
arrayout();
}
while ((gap > 1) & (swapped == true));
}
答案 0 :(得分:1)
首先,我不会硬编码9和10。
其次,我假设arrayout()
打印数组?你在循环之前就是这样做的,然后才进行排序。在循环之后将其移动到最后。
第三,AND运算符为&&
而非&
。 &
是一个按位,而不是你想要的。
否则,它看起来不错。
答案 1 :(得分:0)
想象一下第一次使用数组[1, 8, 7, 5, 4, 3, 2, 1, 6, 9]
。
a[0] < a[9]
,所以它不会被交换。
现在进入while
测试:gap >1
但swapped
为假。所以你退出。
如果任何间隙尺寸的所有项目都已按顺序排列,您将遇到同样的问题。
在开始测试swapped
之前,您需要一直缩小到间隙大小1。
(@ dsa42是正确的,它应该是&&
,但这不会改变逻辑错误。)