昨天在工作中,我着手研究如何在不使用库方法 Array.Sort
的情况下对数字进行排序。我在时间允许的情况下断断续续地工作,终于在今天结束时提出了一个基本的工作算法。这可能是相当愚蠢和最慢的方法,但我很满意我有一个工作代码。
但是逻辑中存在错误或缺失,导致输出在打印行之前挂起:Numbers Sorted。 (2011 年 12 月 17 日凌晨 2:11:42)
此延迟与数组中元素的数量成正比。具体来说,输出只是卡在我在下面的结果部分中放置波浪号的位置。 波浪号之后的内容在明显延迟后打印。
下面是排序的代码:
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
这不是家庭作业,只是我在锻炼。
最佳答案
将 while 中的条件更改为:
while (pass < unsortedNumLen)
逻辑上 pass
never 等于 unsortedNumLen
所以你的 while
不会终止。
pass
在超过 int
的最大值并循环到它时最终等于 unsortedNumLen
。
为了亲自查看它处于挂起状态时发生了什么,只需点击 Visual Studio 中的暂停按钮并将鼠标悬停在 pass
上即可看到它包含一个巨大的值。
您还可以在 while
行上设置一个断点,并为 pass
添加一个监视。这将向您表明,列表第一次排序时,pass
等于 5。
关于c# - 排序数字数组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8540210/