【问题标题】:Sorting Loop Not Sorting First Variable排序循环不排序第一个变量
【发布时间】:2021-11-13 06:19:59
【问题描述】:

这是我的第一个堆栈溢出帖子,如果格式不正确,非常抱歉。无论如何,以下是 C#,我使用的是 Visual Studio 2019 .NET Core 3.1

目标:按升序对整数数组进行排序,例如。 [3, 2, 5, 1] -> [1, 2, 3, 5]

问题:方法对除第一个元素外的所有内容进行排序。 [3, 2, 5, 1] -> [3, 1, 2, 5]

代码:

for (int i = 0; i < array.Length; i++)
{
    if(i != array.Length - 1 && array[i] > array[i + 1])
    {
        int lowerValue = array[i + 1];
        int higherValue = array[i];

        array[i] = lowerValue;
        array[i + 1] = higherValue;

        i = 0;
    }
}

我已经放入了 Console.WriteLine() 语句(一个在上面的 for 循环之外查看起始数组,另一个在 if 语句中查看它在发生更改时如何更新数组,是的,我知道我可以使用调试器,但我目前没有任何方法调用这个 for 循环所在的方法)来查看它如何调整数组,它会定期显示它通过迭代运行而不改变任何东西。

另外,如果有人能告诉我这是什么时间复杂度,那就太好了。我最初的猜测是它是线性的,但我觉得“i = 0”语句和它交换值的方式使它成指数。谢谢!

【问题讨论】:

  • 你调试过这个吗?您应该能够通过逐行逐步了解它在做什么。一旦你让它工作,在你的代码中放一个计数器,看看它对于 5、10、50、100 长度的集合的行为。这将使您了解大 O 复杂性
  • 不,因为我想看看人们还有什么其他建议以及时间复杂度。

标签: c# arrays sorting .net-core


【解决方案1】:

当我运行你的代码时,我得到2135

正如@Flydog57 所说,通过每一步来注意它何时没有按预期运行会很有用。代码看起来有点像没有内部循环的 BubbleSort……迭代也只经过一次。如果我没看错,你就错过了多次迭代。看看BubleSort

我对排序的建议如下:

int[] array = { 3, 2, 5, 1 };
var sortedArray = array.OrderBy(p => p).ToArray();

关于 O 符号,不幸的是,我有点生疏,无能为力。但对我来说,它看起来像 O(n)。

【讨论】:

  • 我试图以线性时间对数组进行排序,如果@Mehrdad Dowlatabadi 对时间复杂度的看法是正确的,那么我没有这样做。冒泡排序是指数的。就实现预期结果而言,我所缺少的是将 i 重置为 -1 而不是 0。所以我提供的示例很糟糕,因为我对为什么第一个值不会切换的理解很差。它是 2135 而不是 3125 就像我说的那样的原因是因为它会对第一个元素进行排序,只要它大于第二个元素 - 我没有抓住;否则,第一个元素将永远不会被排序。
【解决方案2】:

您的算法不是冒泡排序的变体,它在面对降序时会重置循环计数器。在每次遍历的冒泡排序中,我们确信 global 最大/最小值在正确的位置,但您的算法在执行最后一个 i 之前不确定这一点。 在您的算法中,数组的左侧部分始终是部分排序的。

首先,您的代码的问题是,在重置计数器后,循环会将其加到 1(i++),因此在您的代码中,它不能小于 1。如果您将其设置为 -1它将对数组进行排序,因为在将其设置为 -1 后,循环将其更改为 0,这是所需的行为。 if 块应该是这样的:

    if(i != array.Length - 1 && array[i] > array[i + 1])
    {
        int lowerValue = array[i + 1];
        int higherValue = array[i];

        array[i] = lowerValue;
        array[i + 1] = higherValue;

        i = -1;
    }

算法的顺序:最坏的情况发生在数组按降序排列时,在这种情况下,对于每个i,如果条件为真,那么i 将被重置为零,因此总时间复杂度为:

1 + 2 + 3 + 4 + .. + n(数组长度)= n(n+1)/2= O(n^2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 2021-02-16
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多