我刚与我的导师讨论过泡泡排序,他告诉我泡泡排序被称为两个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;
谢谢!
答案 0 :(得分:6)
冒泡排序算法需要两个循环:内部循环遍历项目并交换它们如果相邻的项目乱序,外部循环重复直到不再进行更改。
您的实现 实际上有两个循环。只是其中一个是使用标志和if条件实现的,它会重置外部循环变量。它会做同样的事情 - 循环遍历项目,直到不再需要交换。
但是,请注意,以这种方式构建算法并不会使其更高效,更快或类似。它只是让你更难弄清楚发生了什么。
答案 1 :(得分:2)
您需要嵌套循环,因为一次遍历数组并不总是对所有元素进行排序。
您的代码只有模拟嵌套循环,方法是在我们到达终点时重置i
并仍然需要排序。从理论上讲,如果给定相同的输入数组,则代码将具有与嵌套冒泡排序相同的运行时。
关于你是否可以的问题;当然可以。但重要的是要意识到,在实践或理论上,选择一种形式而不是另一种形式是没有好处的,至少就我所知。
此外,在计算两种算法的时间复杂度时,您将得出结论,您的算法,就像具有嵌套循环的表单一样,将需要执行最多 {{1时间;该操作是通过数组,大约是n
。您必须说服自己,算法就是这种情况。
所以无论你如何切片(我猜是数组双关语?),冒泡排序都会有复杂性n
。
答案 2 :(得分:0)
从语法上讲,您可以进行单循环冒泡排序。 从概念上说,你仍然会有两个循环。
是否与冒泡排序不一样?
是的,它做同样的事情。最多包括嵌套循环。
您的论点似乎是如果您的代码中只有一个for
循环,那么您已经创建了一个单循环冒泡排序。这是一个诡计;仍有两个循环在算法上发生。这真的是唯一重要的事情。
答案 3 :(得分:0)
您的代码实现了冒泡排序。我在教师代码中看不出任何优势。只有两个参数的参数是在循环中改变循环变量是不好的风格,我们应该避免它。
我会改变
if (i == size - 1 && go == false)
到
{{1}}
因为第一个版本引入了一个误解,即我可以大于(但它不能)