【问题标题】:Unable to understand the Bubble Sort algorithm in C无法理解 C 中的冒泡排序算法
【发布时间】:2015-06-08 07:47:38
【问题描述】:
void BubbleSort(int a[], int array_size) {
  int i, j, temp;

  for (i = 0; i < (array_size - 1); ++i) {
    for (j = 0; j < array_size - 1 - i; ++j) {
      if (a[j] > a[j+1]) {
        temp = a[j+1];
        a[j+1] = a[j];
        a[j] = temp;
      }
    }
  }
}

对于冒泡排序算法,为什么我们从第 1 个元素而不是第 0 个元素开始。正如我们所见,有 (++i) 和 (++j)。 这是唯一的,但我似乎无法在代码中掌握。

【问题讨论】:

  • 你应该正确缩进你的代码,它会帮助你更快地理解发生了什么。
  • 我认为 Google 会更好地解释。
  • why do we start with the 1st element and not the 0th element....你确定吗?

标签: c algorithm bubble-sort


【解决方案1】:

for 循环的行为不像你想象的那样。最后一部分,这里的++i++j 是在之后执行循环,而不是之前i++j++ 在这里会做同样的事情。

for (
     i = 0; //First part, executed before the first loop
     i < (array_size - 1); //Second part, executed before each loop
     ++i //Last part, executed AFTER each loop
     )

【讨论】:

  • ... 但许多 C 程序员在这种情况下“自动”使用预增量 (++i),因为它在其他情况下可能更快。 :) 基本上,如果您想增加一个变量并且不立即需要表达式的结果,请使用(或期望其他人使用)预增量。
【解决方案2】:

您从第 0 个元素开始。 ++i 仅在您的代码在同一行使用时才会生效,而不是在 for 循环中:

  • ++i 会增加 i 的值,然后返回增加后的值。

    i = 1; j = ++i; 现在 i=2 和 j=2

  • i++ 将增加 i 的值,但返回 i 在增加之前持有的原始值。

    i = 1; j = i++; 现在 i=2 但 j=1

【讨论】:

    【解决方案3】:
     void BubbleSort(int a[], int array_size)
    {
    int i, j, temp;
    for (i = 0; i < (array_size ); i++)
    {
        for (j = i+1; j < array_size ; j++ )
    {
            if (a[i] > a[j])
    {
    temp = a[j];
    a[j] = a[i];
    a[i] = temp;
    }
    }
    }
    }
    

    我希望上面的代码比较容易理解。 如果您按照以下动画进行操作,您可以更好地理解 bubble sort animation

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 2013-07-13
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2013-11-02
      • 1970-01-01
      相关资源
      最近更新 更多