冒泡排序外循环和N-1
Bubble Sort Outer Loop and N-1
我已经阅读了多篇关于冒泡排序的文章,但仍然很难说出我的代码为何有效,尤其是在外循环方面。
for (int i = 0; i < (n - 1); i++)
{
for (int j = 0; j < (n - i - 1); j++)
{
if (array[j] > array[j + 1])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
对于任何长度为n的数组,最多可以进行n-1次成对比较。也就是说,如果我们在 i < n-1 处停止,我们永远不会 看到 最后一个元素。如果在最坏的情况下,数组的元素(我在这里认为是整数)的顺序相反,我们就不能假设它在正确的位置。所以,如果我们从不检查外循环中的最终数组元素,这怎么可能起作用?
n 通常是数组中元素的数量,因此如果数组中有 10 个元素,则元素的索引将从 0 - 9 开始。您不想像这样在外循环中访问数组 [10]将产生用于访问数组边界的段错误,因此在循环条件语句中使用 "n -1" 。在 C 中,当编写和调用包含迭代数组的函数时,数组的大小也作为参数传递。
在这一行中,您正在访问 j 当前位置之前的 1 个元素
array[j + 1];
在循环的第一次迭代中,你 运行 j 从 0 到 j<(n-0-1),所以当你访问数组时,你可以获得的数组的最后一个索引是 j 小于 n [j+1]。因此,如果您将数组声明为数组 [n],这将获取数组的最后一个元素。
数组索引从0到n-1。如果数组中有 10 个元素,索引将为 n-1。因此,首先,将进行内循环 (n-1) 比较的迭代。冒泡排序的第一遍会将最大的数字冒泡到它的位置。
在下一次迭代中 (n-1-1) 迭代将发生,它将第二大值冒泡到它的位置,依此类推,直到整个数组排序。
n
表示"number of all the elements"。循环中初始编号为0,范围从0到(n-1);所以我们会得到 n 个元素;所有元素都将旅行销售。
我已经阅读了多篇关于冒泡排序的文章,但仍然很难说出我的代码为何有效,尤其是在外循环方面。
for (int i = 0; i < (n - 1); i++)
{
for (int j = 0; j < (n - i - 1); j++)
{
if (array[j] > array[j + 1])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
对于任何长度为n的数组,最多可以进行n-1次成对比较。也就是说,如果我们在 i < n-1 处停止,我们永远不会 看到 最后一个元素。如果在最坏的情况下,数组的元素(我在这里认为是整数)的顺序相反,我们就不能假设它在正确的位置。所以,如果我们从不检查外循环中的最终数组元素,这怎么可能起作用?
n 通常是数组中元素的数量,因此如果数组中有 10 个元素,则元素的索引将从 0 - 9 开始。您不想像这样在外循环中访问数组 [10]将产生用于访问数组边界的段错误,因此在循环条件语句中使用 "n -1" 。在 C 中,当编写和调用包含迭代数组的函数时,数组的大小也作为参数传递。
在这一行中,您正在访问 j 当前位置之前的 1 个元素
array[j + 1];
在循环的第一次迭代中,你 运行 j 从 0 到 j<(n-0-1),所以当你访问数组时,你可以获得的数组的最后一个索引是 j 小于 n [j+1]。因此,如果您将数组声明为数组 [n],这将获取数组的最后一个元素。
数组索引从0到n-1。如果数组中有 10 个元素,索引将为 n-1。因此,首先,将进行内循环 (n-1) 比较的迭代。冒泡排序的第一遍会将最大的数字冒泡到它的位置。
在下一次迭代中 (n-1-1) 迭代将发生,它将第二大值冒泡到它的位置,依此类推,直到整个数组排序。
n
表示"number of all the elements"。循环中初始编号为0,范围从0到(n-1);所以我们会得到 n 个元素;所有元素都将旅行销售。