【问题标题】:Understanding Bubble Sort (Algorithm)了解冒泡排序(算法)
【发布时间】:2015-11-22 23:14:52
【问题描述】:

我试图了解所有交换算法中最简单的一种,即冒泡排序。然而,我似乎对实际交换值的步骤感到困惑,例如考虑代码:

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;

                  }

            }

      }

}

假设我有一个这样的数字列表:

7 1 3 4 6 3 5

我想交换前两个值,7 和 1:

按照我的逻辑,我是这样理解这段代码的:

设置一个临时变量等于 7,所以

temp = 7;

设置 7 等于下一个值,所以

7 = 1; ? 目前的名单是:

1 1 3 4 6 3 5
Where temp = 7

现在设置 1 等于 temp,即 7? 1 = 温度;

So the list is now:
1 7 3 4 6 3 5 

我的理解正确吗?

【问题讨论】:

标签: c++ algorithm bubble-sort


【解决方案1】:

首先,你似乎走在了正确的轨道上。

一些提示可帮助您在旅途中取得进一步进展。

学习标准模板库。有一个名为swap 的函数完全按照它在锡上所说的那样工作。

第二次使用容器。它们比 C 风格的数组更不容易出错。

最后是bubble sort explained via the medium of folk dancing

【讨论】:

    【解决方案2】:

    在这段代码中sn-p

    if (arr[i] > arr[i + 1]) {
    
          tmp = arr[i];
    
          arr[i] = arr[i + 1];
    
          arr[i + 1] = tmp;
    
          swapped = true;
    }
    

    你需要交换两个对象arr[i]arr[i + 1]

    如果你直接写

          arr[i] = arr[i + 1];
    

    那么这两个对象将具有相同的值,即 arr[i] 的先前值将丢失。

    所以首先你需要在某个地方保存这个值。为此,声明了一个辅助中间变量tmp

    所以一开始arr[i] 的值保存在变量tmp 中 假设arr[i] 的值为7,arr[i + 1] 的值为1。

          tmp = arr[i];
    

    现在tmparr[i] 具有相同的值7。

    然后arr[i]被arr[i + 1]的值覆盖

          arr[i] = arr[i + 1];
    

    现在这两个变量具有相同的值 1,即 arr[i + 1] 的值

    tmp 等于 7,arr[i] 和 arr[i + 1] 等于 1

    但是 arr[i] 的先前值保留在变量 tmp 中 所以现在这个值被分配给arr[i + 1]

          arr[i + 1] = tmp;
    

    我们得到 arr[i + 1] 等于 7 并且 arr[i] 等于 tp 1

    因此这些值被交换了。

    【讨论】: