理解冒泡排序

时间:2016-09-27 18:15:48

标签: c++ algorithm sorting

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?

3 个答案:

答案 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。最后我们有一个排序数组。