为什么你不能有一个循环进行冒泡排序?

时间:2015-07-27 23:26:13

标签: c++ bubble-sort

我刚与我的导师讨论过泡泡排序,他告诉我泡泡排序被称为两个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;

谢谢!

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

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

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

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

此外,在计算两种算法的时间复杂度时,您将得出结论,您的算法,就像具有嵌套循环的表单一样,将需要执行最多 {{1时间;该操作是通过数组,大约是n。您必须说服自己,算法就是这种情况。

所以无论你如何切片(我猜是数组双关语?),冒泡排序都会有复杂性n

答案 2 :(得分:0)

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

  

是否与冒泡排序不一样?

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

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

答案 3 :(得分:0)

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

我会改变

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

{{1}}

因为第一个版本引入了一个误解,即我可以大于(但它不能)