【问题标题】:Adding a break to a bubble sort in case the array is already sorted在数组已经排序的情况下为冒泡排序添加一个中断
【发布时间】:2017-09-01 07:59:33
【问题描述】:

我目前有一个名为“sorted”的对象数组的冒泡排序(有点乱),代码如下

object storage = 0;
for (int i = 0; i < sorted.Length; i++)
{
    for (int c = 0; c < sorted.Length - 1; c++)
    {
        if (sorted[c].ToString().CompareTo(sorted[c + 1].ToString()) > 0)
        {
            storage = sorted[c + 1];
            sorted[c + 1] = sorted[c];
            sorted[c] = storage;
        }
    }
    return sorted;

问题是这个函数总是循环遍历数组,无论如何。假设地说,“排序”数组可能是一个大数组,并且恰好已经排序,在这种情况下,该函数仍会扫描数组并工作一段时间,我想防止这种情况发生。 所以问题是,如果数组已经排序,如何正确停止循环?

【问题讨论】:

  • 没有内置函数来检查数组是否排序。在每种情况下,您都需要访问数组的每个元素。排序数组的最佳时间复杂度为 O(n)。
  • 插入排序对你有用吗?对于已排序的数组,它的时间复杂度为 O(n)。
  • 还有一个更通用的优化,可以将内循环限制在最后一次迭代做swap的位置。

标签: c# arrays loops sorting


【解决方案1】:

冒泡排序将数组的最大(最小)元素冒泡到数组的末尾。这就是你的内部循环所做的。

首先,您可以利用知识,在 n 次迭代之后,最后 n 个元素已经排序,这意味着您的内部循环不需要检查第 (n+1) 个中的最后 n 个元素迭代。

其次,如果内循环没有改变任何东西,则元素必须已经按顺序排列,这是中断外循环的好点。

由于您将其作为练习练习,因此我将把编码留给您 :-)

【讨论】:

  • 更好,但仍然不是“最佳”冒泡排序。如此矛盾。
  • 是的,您对更优化优化的评论将使它变得更好。的确。这是我第二点的概括。
【解决方案2】:

为什么不用OrderBy 而不是自己排序呢?

sorted = sorted.OrderBy(s=> s).ToArray();

如果你坚持使用冒泡排序,你可以这样做:

bool changed;
for (int i = 0; i < sorted.Length; i++)
{
    changed = false;
    for (int c = 0; c < sorted.Length - 1; c++)
    {
        if (sorted[c].ToString().CompareTo(sorted[c + 1].ToString()) > 0)
        {
            changed = true;
            storage = sorted[c + 1];
            sorted[c + 1] = sorted[c];
            sorted[c] = storage;
        }
        if(!changed) break;
    }

我在第一个循环中每次都将设置更改为 false。如果最后没有变化,那么数组已经排好序了。

【讨论】:

  • 现在只是练习不同的东西,冒泡排序就是其中之一:)
【解决方案3】:

试试这个:

object storage = 0;
for (int i = 0; i < sorted.Length; i++)
{
    bool swapped = false;
    for (int c = 0; c < sorted.Length - 1; c++)
    {
        if (sorted[c].ToString().CompareTo(sorted[c + 1].ToString()) > 0)
        {
            storage = sorted[c + 1];
            sorted[c + 1] = sorted[c];
            sorted[c] = storage;
            swapped = true;
        }
    }
    if (!swapped)
    {
        break;
    }
}

如果它在没有交换的情况下通过传递,那么数组是有序的,所以它将break

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2022-11-04
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2013-09-28
    相关资源
    最近更新 更多