首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序数字数组问题

排序数字数组问题
EN

Stack Overflow用户
提问于 2011-12-16 21:12:28
回答 4查看 1.6K关注 0票数 4

昨天工作时,我开始研究如何在不使用库方法Array.Sort的情况下对数字进行排序。我在时间允许的时候断断续续地工作,最后终于在今天结束时提出了一个基本的工作算法。这可能是相当愚蠢和最慢的方式,但我满足于我有一个工作的代码。

但是逻辑中有一些错误或缺失,导致输出在打印行之前挂起:Numbers Sorted. (12/17/2011 2:11:42 AM)

这种延迟与数组中的元素数成正比。具体来说,输出只挂在我在下面的结果部分中放置倾斜点的位置。倾斜后的内容在明显的延迟之后被打印出来.

下面是执行排序的代码:

代码语言:javascript
复制
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++;
    }
}

结果:

代码语言:javascript
复制
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

你能帮我找出这个问题吗?

链接到完整代码

这不是家庭作业,只是我在锻炼。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-16 21:25:20

听起来你想要一个提示来帮助你完成它并学习,所以我没有发布一个完整的解决方案。

将您的else块更改为下面,并查看它是否将您置于正确的轨道上。

代码语言:javascript
复制
else {

    Console.WriteLine("Nothing to do for {0} and {1}", unsorted[i], unsorted[j]);
    pass++;
}
票数 4
EN

Stack Overflow用户

发布于 2011-12-16 21:23:04

将时间内的条件更改为:

代码语言:javascript
复制
while (pass < unsortedNumLen)

从逻辑上讲,pass 从不等于unsortedNumLen,所以while不会终止。

pass超过int的最大值并循环到它时,它最终等于unsortedNumLen

为了查看您在处于挂起状态时发生了什么,只需单击Visual中的“暂停”按钮,并将鼠标悬停在pass上,以查看其中包含了一个巨大的值。

您还可以在while行上设置一个断点,并为pass添加一个手表。这将显示列表第一次排序时,pass等于5。

票数 6
EN

Stack Overflow用户

发布于 2011-12-16 21:39:02

以下是解决办法:

代码语言:javascript
复制
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.你可能想看看这个链接

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8540210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档