昨天工作时,我开始研究如何在不使用库方法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你能帮我找出这个问题吗?
链接到完整代码
这不是家庭作业,只是我在锻炼。
发布于 2011-12-16 21:25:20
听起来你想要一个提示来帮助你完成它并学习,所以我没有发布一个完整的解决方案。
将您的else块更改为下面,并查看它是否将您置于正确的轨道上。
else {
Console.WriteLine("Nothing to do for {0} and {1}", unsorted[i], unsorted[j]);
pass++;
}发布于 2011-12-16 21:23:04
将时间内的条件更改为:
while (pass < unsortedNumLen)从逻辑上讲,pass 从不等于unsortedNumLen,所以while不会终止。
当pass超过int的最大值并循环到它时,它最终等于unsortedNumLen。
为了查看您在处于挂起状态时发生了什么,只需单击Visual中的“暂停”按钮,并将鼠标悬停在pass上,以查看其中包含了一个巨大的值。
您还可以在while行上设置一个断点,并为pass添加一个手表。这将显示列表第一次排序时,pass等于5。
发布于 2011-12-16 21:39:02
以下是解决办法:
while(pass < unsortedNumLen)这就是延迟发生的原因。
在最终对数组进行排序的for循环结束后,pass最多包含unsortedNumLen - 2 (如果最后一次更改是在第一成员和第二成员之间)。但是它不等于unsorted数组的长度,所以while和内部for的另一个迭代就开始了。因为数组是排序的,所以unsorted[i] > unsorted[j]总是假的,所以pass总是递增--确切地说是j递增的次数,也就是unsortedNumLen - 1。这并不等于unsortedNumLen,所以while的另一个迭代就开始了。本质上没有什么改变,在这个迭代之后,pass包含2 * (unsortedNumLen - 1),它仍然不等于unsortedNumLen。诸若此类。
当pass到达值int.MaxValue时,就会发生溢出,变量pass将得到的下一个值是int.MinValue。这个过程继续进行,直到pass最终得到unsortedNumLen值,此时while条件被检查。如果你特别不幸,这可能永远不会发生。
P.S.你可能想看看这个链接。
https://stackoverflow.com/questions/8540210
复制相似问题