我既不熟悉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);}
我已尝试将其删除,它不会影响任何内容,
嗯,您测试过性能吗?
尝试巨大的数组,并测量进行和不进行该行排序所需的时间。
该行确保了内部循环不会访问已经排序的数字。
如果删除该行,则内部循环每次将迭代size
次。
使用该行,内部循环将首先迭代size
次,然后再迭代size-1
,然后再迭代size-2
...这将提供更好的性能。
您的算法的for
循环会循环数组元素,如果a[i]>a[i+1]
,则会交换相邻的元素。经过此循环后,经过的最后一个元素一定一定是所循环的所有元素中最大的元素,它已经冒泡了。因此,在下一轮while
循环中,for
循环不必再次考虑此元素。这可以通过last--
来确保。如果删除该行,该算法将起作用,但是将进行两倍的比较,而所有这些比较都是不必要的。
仅是算法的优化。
每次通过之后,数组的远端部分将被排序。因此,我们不再需要检查它。由于for
循环基于limit
,因此添加limit--;
只会缩小循环。
我已尝试将其删除,它不会影响任何东西,所以是否有必要放最后一个;;?
不,该算法不起作用。没有它,它将同样快乐地工作。这纯粹是一种优化,将对性能产生影响,特别是对于较大的阵列。