Stack Overflow 我正在研究算法,所以我可以逐个分解它们以了解发生了什么。无论如何,我正在查看this教程以查看冒泡排序。我对C ++中演示算法的一小部分感到困惑,即整数j。
void bubbleSort(int arr[], int n) {
bool swapped = true;
int j = 0;
int tmp;
while (swapped) {
swapped = false;
j++;
for (int i = 0; i < n - j; i++) {
if (arr[i] > arr[i + 1]) {
tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
swapped = true;
}
}
}
}
它是算法的必需部分吗?我并不真正理解它在做什么,就像我在for循环中交换j为1时,我得到了相同的结果。
for (int i = 0; i < n - 1; i++)
TL; DR: 为什么算法中的int j?
答案 0 :(得分:1)
在第一个外部迭代中,我们将最大整数向下冒泡到a[n-1]
。第二次迭代只需要遍历数组的剩余未排序部分,即从索引0到n-2,并将第二大整数向下冒泡到a[n-2]
。第三次迭代只需要遍历从索引0到n-3的数组,依此类推。
变量j
通过在后续外部迭代中限制要遍历的数组范围来实现此目的。我们可以在每次迭代中很好地遍历整个数组(就像用n-j
更改n-1
后一样)并获得相同的结果。但这样效率很低,因为我们不必要地在每次迭代中比较数组的排序部分中的元素。如果您有任何问题,请告诉我。
答案 1 :(得分:1)
当bubblesort工作时,它会在列表中向上移动,它会将较大的数字交换到列表的末尾。这意味着,对于算法的每次迭代,都保证对最后的元素进行排序。如果对最后的元素进行了排序,则没有必要重新访问它们以再次对它们进行排序。 n-j
通过限制在任何迭代中访问的列表范围来防止这种情况。如果j
随着算法的进行而增长,n-j
会收缩。
不仅仅是查看代码,而是在the debugger中启动,几乎可以肯定的是你的开发环境(如果你没有带调试器的开发环境,那么很久你就会纠正这个问题。调试器可能是工作程序员拥有的最好的生产力工具,并逐步完成代码。观察列表中发生的情况以及每次迭代时访问的列表范围。
调试器不仅是修复代码的好工具,它也是一个很好的教育工具。
答案 2 :(得分:0)
j变量用于向右移动最大数字。在每次迭代中,我们将指针从n(最初n-j = n,因为j为0)移动到步骤1的0。最后我们有一个排序数组。