昨天在工作中我开始计算如何在不使用库方法Array.Sort
的情况下对数字进行排序。我在时间允许的情况下上班和下班,最后能够在今天结束时提出基本的工作算法。它可能是相当愚蠢和最慢的方式,但我满足于我有一个有效的代码。
但逻辑中存在错误或缺失,导致输出在打印行之前挂起:Numbers Sorted. (12/17/2011 2:11:42 AM)
此延迟与数组中元素的数量成正比。具体来说,输出只是挂在我将波浪号放在下面结果部分的位置。 在明显延迟之后打印代字号后的内容。
以下是执行排序的代码:
while(pass != unsortedNumLen)
{
for(int i=0,j=1; i < unsortedNumLen-1 && j < unsortedNumLen; i++,j++)
{
if (unsorted[i] > unsorted[j])
{
pass = 0;
swaps++;
Console.Write("Swapping {0} and {1}:\t", unsorted[i], unsorted[j]);
tmp = unsorted[i];
unsorted[i] = unsorted[j];
unsorted[j] = tmp;
printArray(unsorted);
}
else pass++;
}
}
结果:
Numbers unsorted. (12/17/2011 2:11:19 AM)
4 3 2 1
Swapping 4 and 3: 3 4 2 1
Swapping 4 and 2: 3 2 4 1
Swapping 4 and 1: 3 2 1 4
Swapping 3 and 2: 2 3 1 4
Swapping 3 and 1: 2 1 3 4
Swapping 2 and 1: 1 2 3 4
~
Numbers sorted. (12/17/2011 2:11:42 AM)
1 2 3 4
Number of swaps: 6
您能帮助我确定尝试的问题吗?
Link to full code
这不是功课,只是我在锻炼。
答案 0 :(得分:6)
将您的情况更改为:
while (pass < unsortedNumLen)
逻辑上pass
从不等于unsortedNumLen
,因此您的while
不会终止。
pass
在超过unsortedNumLen
的最大值时会最终等于int
并循环播放。
为了查看处于挂起状态时自己发生了什么,只需点击Visual Studio中的暂停按钮,将鼠标悬停在pass
上即可看到它包含巨大的值。
您还可以在while
行设置断点,并为pass
添加监视。这将向您显示列表第一次排序时,pass
等于5。
答案 1 :(得分:4)
听起来你想要一个提示来帮助你完成它并学习,所以我没有发布一个完整的解决方案。
将else
块更改为以下内容,看看它是否能让您走上正确的轨道。
else {
Console.WriteLine("Nothing to do for {0} and {1}", unsorted[i], unsorted[j]);
pass++;
}
答案 2 :(得分:2)
以下是修复:
while(pass < unsortedNumLen)
这就是延迟发生的原因。
在最终对数组进行排序的for
循环结束后,pass
最多包含unsortedNumLen - 2
(如果最后一次更改是在第一个和第二个成员之间)。但它不等于unsorted
数组长度,因此while
和内部for
的另一次迭代开始。由于数组已排序unsorted[i] > unsorted[j]
始终为false,因此pass总是递增 - 确切地增加j
递增的次数,即unsortedNumLen - 1
。这不等于unsortedNumLen
,因此while
的另一次迭代开始。没有什么实际改变,并且在此迭代后pass
包含2 * (unsortedNumLen - 1)
,它仍然不等于unsortedNumLen
。等等。
当传递达到值int.MaxValue
时,会发生溢出,而变量pass
将获得的下一个值为int.MinValue
。此过程继续进行,直到pass
在检查unsortedNumLen
条件时最终获得值while
。如果你特别不走运,这可能永远不会发生。
P.S。您可能需要查看此link。
答案 3 :(得分:1)
这只是您用于排序的算法的一个特征。一旦完成对元素的排序,它就无法知道排序是否完整,因此它会再次检查每个元素。您可以通过在for循环结束时添加--unsortedNumLen;
来解决此问题,如下所示:
for(int i=0,j=1; i < unsortedNumLen-1 && j < unsortedNumLen; i++,j++)
{
/// existing sorting code
}
--unsortedNumLen;
原因?因为你的算法将最大的值冒泡到数组的末尾,所以不需要再次检查这个元素,因为它已经被确定为更大的所有其他元素。