[英]C++ Bubble Sort Algorithm
我在 c++ 中编写了以下代码,并且该算法在这种情况下有效。 我知道 c++ 并且不明白我在第二次测试中做错了什么。
#include <iostream>
using namespace std;
void bubbleSort(int numbers[], int size) {
for (int i = 0; i<size;i++) {
for (int j=0; j<size;j++) {
if (numbers[j] > numbers[j+1]) {
swap(numbers[j], numbers[j+1]);
}
}
}
}
int main() {
int numbers[] = {7,5,6,4};
bubbleSort(numbers,4);
for (int print = 0; print < 4; print++) {
cout << numbers[print] << endl;
}
return 0;
}
但是,当我尝试输入已经排序的数字时失败了:
#include <iostream>
using namespace std;
void bubbleSort(int numbers[], int size) {
for (int i = 0; i<size;i++) {
for (int j=0; j<size;j++) {
if (numbers[j] > numbers[j+1]) {
swap(numbers[j], numbers[j+1]);
}
}
}
}
int main() {
int numbers[] = {1,2,3};
bubbleSort(numbers,3);
for (int print = 0; print < 3; print++) {
cout << numbers[print] << endl;
}
return 0;
}
for (int j=0; j<size;j++) {
例如,如果size
为 3,如果数组具有三个值,则此循环将迭代j
的值 0、1 和 2。
if (numbers[j] > numbers[j+1]) {
当j
为 2 时,它会将numbers[2]
与numbers[3]
进行比较。
没有numbers[3]
。 这是未定义的行为。 循环关闭 1 个值。
此外,整体的冒泡排序实现是有缺陷的。 在所示代码中,内部循环每次都遍历整个数组(忽略 off-by-1 错误)。 在经典的冒泡排序中,第一次通过(外循环的第一次迭代)导致内循环遍历整个数组并将最小/最大值“冒泡”到数组的末尾。 在下一次传递中,内部循环不需要迭代整个数组,而只需要迭代到数组的第二个最小/最大 position。 依此类推,每次通过(外循环)都会导致内循环迭代数组的越来越小的子集,将相应的值“冒泡”到适当的停止点。
除了修复 off-by-1 错误之外,如果您希望获得完美的家庭作业成绩,您还需要调整此冒泡排序的整体逻辑。
完全实施冒泡排序是有问题的。 在示例代码中,内循环重复遍历整个数组,同时忽略移位 1。在传统冒泡排序的外循环的第一次迭代中,内循环遍历整个数组,将最小/最大值“冒泡”到阵列的末端。 在随后的迭代中,内部循环只需迭代到数组的第二小/最大点,而不是整个数组。 然后,内部循环遍历数组的一个越来越小的子集,使关联值的气泡在外部循环中的每次连续运行中停止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.