【问题标题】:Why cant you have one loop for bubble sort?为什么你不能有一个冒泡排序循环?
【发布时间】:2015-10-18 08:13:40
【问题描述】:

我刚刚和我的导师争论冒泡排序,他告诉我冒泡排序被称为两个 for 循环,一个嵌套在另一个循环中。在我开始分配之前没有给出,所以没关系,但是这个冒泡排序代码有什么问题:

int num = 0, i = 0;
bool go = true;
while (i < size - 1){
    if (array[i] > array[i + 1]){
        num = array[i];
        array[i] = array[i + 1];
        array[i + 1] = num;
        go = false;
    }
    i++;
    if (i >= size - 1 && go == false){
        i = 0;
        go = true;
    }
}

for (int i = 0; i < size; i++){
    cout << array[i];
}

它和冒泡排序不一样吗?

int i, j;
bool flag = true;
int temp;
int numLength = size;
for (i = 1; (i <= numLength) && flag; i++)
{
    flag = false;
    for (j = 0; j < (numLength - 1); j++)
    {
        if (array[j + 1] < array[j])
        {
            temp = array[j];
            array[j] = array[j + 1];
            array[j + 1] = temp;
            flag = true;
        }
    }
}

for (int i = 0; i < size; i++){
    cout << array[i];
}

return;

谢谢!

【问题讨论】:

  • 我输入了错误的代码,抱歉现在是正确的!
  • 好吧,也许你可以称之为冒泡排序,没有内部循环! :P 但是,内部循环正在为您做的事情现在您正在使用igo 和一个额外的if 条件..
  • 理论上,任何东西都可以重写为一个循环。 (因为那是图灵完备的)但这并不意味着它看起来会很漂亮。
  • 我知道这不是“漂亮”,但没有提供使用两个嵌套循环的信息并要求某人制作一个执行冒泡排序的程序,我的回答不正确吗?跨度>
  • 这是两个循环,而不是两个 for 循环。

标签: c++ bubble-sort


【解决方案1】:

您需要嵌套循环,因为遍历数组并不总是对所有元素进行排序。

您的代码仅模拟嵌套循环,方法是在我们到达终点但仍有待排序时重置i。从理论上讲,如果给定相同的输入数组,您的代码将具有与嵌套冒泡排序相同的运行时间。

关于你是否可以的问题;当然可以。但重要的是要认识到,在实践中或理论上,选择一种形式而不是另一种形式没有任何好处,至少据我所知。

另外,在计算这两种算法的时间复杂度时,您会得出这样的结论:您的算法,就像嵌套循环的形式一样,最多需要执行操作n次;该操作是通过数组,其顺序为n。您必须说服自己,您的算法就是这种情况。

所以无论你如何分割它(我猜是数组双关语,我猜?),冒泡排序将具有复杂性O(n^2)

【讨论】:

    【解决方案2】:

    冒泡排序算法需要两个循环:内部循环遍历项目并在相邻的项目无序时交换它们,外部循环重复直到不再进行更改。

    您的实现确实实际上有两个循环。只是其中一个是使用标志和 if 条件实现的,它重置了外部循环变量。它会做同样的事情 - 循环遍历项目,直到不再需要交换。

    但是请注意,以这种方式构建算法并不会使其更高效、更快或类似的东西。它只是让我们更难弄清楚发生了什么。

    【讨论】:

    【解决方案3】:

    从语法上讲,您可以进行单循环冒泡排序。 从概念上来说,你仍然会有两个循环。

    它和冒泡排序不一样吗?

    是的,它做同样的事情。最多包含嵌套循环。

    您的论点似乎是,如果您的代码中只有一个for 循环,那么您就创建了一个单循环冒泡排序。这是一个诡计;仍然有两个循环在算法上发生。这真的是唯一重要的事情。

    【讨论】:

      【解决方案4】:

      您的代码实现了冒泡排序。我在您的讲师代码中看不到任何优势。只有两个参数的参数是在循环内更改循环变量是不好的风格,我们应该避免它。

      我会改变

      if (i >= size - 1 && go == false)
      

      if (i == size - 1 && go == false)
      

      由于第一个版本引入了我可以大于大小(但不能)的误解

      【讨论】:

        猜你喜欢
        • 2022-01-05
        • 2012-08-28
        • 2015-09-12
        • 1970-01-01
        • 2021-05-11
        • 2023-03-29
        • 1970-01-01
        • 2017-10-30
        • 2020-05-30
        相关资源
        最近更新 更多