last--的用途是什么;这里?

问题描述 投票:0回答:3

我既不熟悉C ++,也不熟悉算法,有人可以帮我解释一下代码中间(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);}
c++ algorithm iostream bubble-sort
3个回答
3
投票

我已尝试将其删除,它不会影响任何内容,

嗯,您测试过性能吗?

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

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

如果删除该行,则内部循环每次将迭代size次。

使用该行,内部循环将首先迭代size次,然后再迭代size-1,然后再迭代size-2 ...这将提供更好的性能。


0
投票

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


0
投票

仅是算法的优化。

每次通过之后,数组的远端部分将被排序。因此,我们不再需要检查它。由于for循环基于limit,因此添加limit--;只会缩小循环。

我已尝试将其删除,它不会影响任何东西,所以是否有必要放最后一个;;?

不,该算法不起作用。没有它,它将同样快乐地工作。这纯粹是一种优化,将对性能产生影响,特别是对于较大的阵列。

© www.soinside.com 2019 - 2024. All rights reserved.