c# - 排序数字数组问题

标签 c# sorting

昨天在工作中,我着手研究如何在不使用库方法 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/

相关文章:

c# - Unity Asset Bundle 向后兼容性

python - 跨多个时间段计算前 10 名或前 X 名列表的有效方法

c++ - 将元素附加到 vector 会导致后续排序失败

c# - 搜索 .NET(和 ASP.NET)的标签系统

sorting - J 排序函数 : 1/:1 returns 0

PHP - 通过维护原始数组键按子数组值对数组进行排序

Python树遍历和排序列表中的项目组排序

c# - 如何避免分页期间数据库调用

c# - 将值从 java 脚本传递到隐藏字段不起作用

c# - 如何向域实体注入(inject)服务以及如何持久化实体