这段代码是气泡排序程序吗?
Is this code a bubble sorting program?
我做了一个简单的气泡排序程序,代码工作,但我不知道它是否正确。
我对冒泡排序算法的理解是它检查一个元素和它旁边的另一个元素。
#include <iostream>
#include <array>
using namespace std;
int main()
{
int a, b, c, d, e, smaller = 0,bigger = 0;
cin >> a >> b >> c >> d >> e;
int test1[5] = { a,b,c,d,e };
for (int test2 = 0; test2 != 5; ++test2)
{
for (int cntr1 = 0, cntr2 = 1; cntr2 != 5; ++cntr1,++cntr2)
{
if (test1[cntr1] > test1[cntr2]) /*if first is bigger than second*/{
bigger = test1[cntr1];
smaller = test1[cntr2];
test1[cntr1] = smaller;
test1[cntr2] = bigger;
}
}
}
for (auto test69 : test1)
{
cout << test69 << endl;
}
system("pause");
}
这是一个冒泡排序实现。它只是一个非常基本的。
两个改进:
- 外循环迭代可能每次都缩短一次,因为您可以保证前一次迭代的最后一个元素将是最大的。
- 如果在迭代期间没有进行交换,则完成。(这是维基百科中气泡排序定义的一部分)
一些评论:
- 使用更好的变量名(test2?)
- 使用容器的大小或范围,不要硬编码5.
- 使用
std::swap()
交换变量可以使代码更简单。
下面是一个使用(随机访问)迭代器的更通用的示例,其中包含我建议的改进和注释,以及Yves Daoust提出的改进(迭代到最后一次交换),其中包含debug-print
你的算法的正确性可以解释如下:
在第一次(内循环)中,比较T[i] > T[i+1]
与可能的交换,确保T[i]
中最大的T[i+1]
在右边。从左到右重复所有对,确保最后T[N-1]
拥有最大的元素。(数组只能通过交换来修改,这确保了没有元素丢失或重复。)
在第二次传递中,通过同样的推理,N-1
中第一个元素中最大的元素被转移到T[N-2]
,并且它留在那里,因为T[N-1]
更大。
更一般地说,在K
传递中,N-K+1
第一个元素中最大的元素被转移到T[N-K]
,留在那里,后面的元素保持不变(因为它们已经在增加)。
因此,在N
通过后,所有元素都就位了。
这暗示了一个简单的优化:传递中最后一次交换之后的所有元素都到位(否则交换不会是最后一次)。因此,您可以记录最后一次交换的位置,并只执行到该位置的下一次传递。
虽然这个变化似乎没有提高很多,但它可以减少传递的次数。实际上,通过这个过程,传递的次数等于最大位移,即元素到达适当位置所需的步数(过多的元素一次只能移动一个位置)。
在某些配置中,这个数字可以很小。例如,对已经排序的数组进行排序需要一次传递,对所有元素成对交换的数组进行排序需要两次传递。这是从O(N²)到O(N)的改进!
是。你的代码就像冒泡排序一样。
输入:3 5 1 8 2
每次迭代后的输出:
3 1 5 2 8
1 3 2 5 8
1 2 3 5 8
1 2 3 5 8
1 2 3 5 8
1 2 3 5 8
实际上,在内部循环中,我们不需要从第二次迭代开始一直到数组的末尾,因为前一次迭代中最重的元素已经在最后一次迭代中了。但这并不能改善时间复杂度。所以,你可以走了。
小的非正式证明:
排序算法背后的思想是遍历值数组(从左到右)。我们就当它通过吧。在传递过程中,对值进行检查并交换以使其按正确顺序排列(右上)。
在第一次通过时将达到最大值。当达到最大值时,最大值将高于它旁边的值,因此它们将被交换。这意味着max将成为pass中下一对的一部分。这个过程一直重复,直到pass完成,max移动到数组的右端。
在第二次传递时,对于数组中第二高的值也是如此。唯一的区别是它不会在最后与max交换。现在两个最正确的值被正确设置。
在接下来的每一次传递中,一个值将被向右排序。
有N个值和N次传递。这意味着在N通过后,所有N个值将按如下方式排序:
{第k大,(k-1)第th大,......第二大,最大}
不,不是。情况更糟。在变量cntr1
中没有任何意义。您应该在这里使用test1
,并且您应该参考许多规范的bubblessort实现之一,而不是试图为自己创建它。
- 在气泡排序程序中未声明错误功能
- 气泡排序未正确循环
- 带有枚举方向/类型的气泡排序结构数组
- 在气泡排序中使用递归
- 如何在C++中实现气泡排序?
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- C++气泡排序的问题
- 气泡排序C++ OOP
- OOP 气泡排序C++程序
- 按升序对列表进行排序,C++使用气泡排序
- C++气泡排序
- 此气泡排序代码中的错误是什么?
- 气泡排序 2D 数组
- 如何使用气泡排序从最小到最大对 4 个数组进行排序? C++
- 添加气泡排序代码以排列列表
- 使用向量和气泡排序的动态内存分配
- 带修改(偏移)的气泡排序
- 使用C++进行气泡排序
- 气泡阵列在C 实现中排序
- 选择排序与气泡排序C++