【问题标题】:What is the use of last--; here?last--有什么用;这里?
【发布时间】:2019-09-26 06:01:20
【问题描述】:

我是 C++ 和算法的新手,谁能帮我解释一下在我的代码中间使用 (last--;) 吗?我得到的解释是每次数组通过时都会增加一个值,所以我们需要在外面放一个last--。我试过删除它,它不会影响任何东西,所以有必要放一个last--;吗?

void bubbleSort(int array[], int size)
{
    bool swap;
    int temp;
    int last = size - 1;    

    do
    {
        swap = false;

        for (int count = 0; count < last; count++)
        {
            if (array[count] > array[count + 1])
            {               
                temp = array[count];
                array[count] = array[count + 1];
                array[count + 1] = temp;
                swap = true;
            }
        }

        last--; 

    } while (swap != false);
}

【问题讨论】:

  • 最后的分号(我想在while 之后)是完全必要的,你不能省略它。你指的是哪个分号?
  • 我猜这是一种优化。您知道数组的末尾已排序,因此每次通过后您不必搜索那么远。但这只是一个猜测。它“不会影响任何事情”,因为该部分无论如何都已经排序了。
  • 它用于每次比上一次少一次重复内部循环,因此您不考虑最后移动的元素。无论如何,正如你所尝试的,它并不是绝对必要的,它只是为了“效率”(在非常大的数组中可能会有一些好处)。

标签: c++ algorithm iostream bubble-sort


【解决方案1】:

我已经尝试删除它,它不会影响任何东西,

嗯,你测试过性能吗?

尝试一个巨大的数组并测量使用和不使用该行进行排序所需的时间。

该行确保内部循环不会访问已排序的数字。

如果删除该行,内部循环每次都会迭代size 次。在最坏的情况下,这将给size x size 迭代。

使用该行,内部循环将首先迭代 size 次,然后是 size-1,然后是 size-2... 在最坏的情况下,将进行 size x (size-1) / 2 迭代,即 aprox。迭代次数减少一半,从而获得更好的性能。

【讨论】:

    【解决方案2】:

    如果a[i]&gt;a[i+1],算法的for 循环循环数组元素并交换相邻元素。在这个循环经过一次之后,经过的最后一个元素肯定是循环经过的所有元素中最大的一个,它已经冒泡了。因此,在while 循环的下一轮中,for 循环不必再次考虑该元素。这是由last-- 确保的。 如果删除该行,算法将起作用,但会进行两倍的比较,所有这些都是不必要的。

    【讨论】:

      【解决方案3】:

      只是算法的优化。

      每次遍历后,数组的最远部分都会排序。所以我们不再需要检查它了。由于for 循环基于limit,添加limit--; 只是收缩循环。

      我试过删除它,它不影响任何东西,所以有必要放一个last--;吗?

      不,算法不工作。没有它,它也会一样愉快地工作。它只是一个纯粹的优化,会影响性能,尤其是对于更大的数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多