我目前有一个(有点凌乱)冒泡的对象数组,名为" 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;数组可能是一个大数组,恰好已经排序,在这种情况下,函数仍然会扫描数组并工作一段时间,我想阻止它。 所以问题是,如果数组已经排序,我该如何正确地停止循环呢?
答案 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
。