如果数组已经排序,则为冒泡排序添加中断

时间:2017-09-01 07:59:34

标签: c# arrays loops sorting

我目前有一个(有点凌乱)冒泡的对象数组,名为" 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;

问题是这个函数总是在数组中循环,无论如何。假设&#34;排序&#34;数组可能是一个大数组,恰好已经排序,在这种情况下,函数仍然会扫描数组并工作一段时间,我想阻止它。 所以问题是,如果数组已经排序,我该如何正确地停止循环呢?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

为什么不使用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。如果结尾没有变化,那么数组已经排序了。

答案 2 :(得分:-1)

试试这个:

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