排序数字数组问题

时间:2011-12-16 21:12:28

标签: c# sorting

昨天在工作中我开始计算如何在不使用库方法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
这不是功课,只是我在锻炼。

4 个答案:

答案 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;

原因?因为你的算法将最大的值冒泡到数组的末尾,所以不需要再次检查这个元素,因为它已经被确定为更大的所有其他元素。