冒泡排序算法保持数组不变
Bubble Sort algorithm leaves array unchanged
我正在尝试编写一个简单的冒泡排序算法,但它不起作用。最后打印时数组不变
我已经在我的 IDE 上使用了调试工具,它告诉我第二个 for 循环没有递增,但我不知道为什么不是。
总的来说,我对学习 C++ 和算法还是陌生的,所以对此的指点会很有帮助。
这是代码,非常感谢。
#include <iostream>
int main(){
int A[] = {13, 89, 43, 74, 45, 16};
int n = sizeof(A)/sizeof(*A);
for (int i=0; i<n; i++) { //pass through the algorithm n-1 times
int flag = 0;
for (int j=0; j<n-i-1; j++) { //optimise checks, avoid checking sorted part of array
if (A[j] > A[j+1]) {
int temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
flag = 1; //shows a swap happened
}
if (flag == 0) { //no swaps have occurred so the loop is over
break;
}
}
}
for (int i = 0; i < n; i++) {
std::cout << A[i] << " ";
}
return 0;
}
你的算法有误。您应该在 flag
第二个循环完成后 检查
int flag = 0;
for (int j=0; j<n-i-1; j++) { //optimise checks, avoid checking sorted part of array
if (A[j] > A[j+1]) {
int temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
flag = 1; //shows a swap happened
}
}
if (flag == 0) { //no swaps have occurred so the loop is over
break;
}
事实上,您在第二个循环之前初始化标志,但在第二个循环中检查它应该是一个线索,表明某些地方不太正确。所以应该让调试器告诉你第二个循环没有递增。
有时,当您查看自己的代码时,您只会看到您认为自己编写的内容,而不是您实际编写的内容。客观地看自己的代码是需要培养自己的习惯。
只有一个错误:
if (flag == 0) { //no swaps have occurred so the loop is over
break;
}
这应该在第二个 for 循环之外。
#include <iostream>
int main(){
int A[] = {13, 89, 43, 74, 45, 16};
int n = sizeof(A)/sizeof(*A);
for (int i=0; i<n; i++) { //pass through the algorithm n-1 times
int flag = 0;
for (int j=0; j<n-i-1; j++) { //optimise checks, avoid checking sorted part of array
if (A[j] > A[j+1]) {
int temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
flag = 1; //shows a swap happened
}
}
if (flag == 0) { //no swaps have occurred so the loop is over
break;
}
}
for (int i = 0; i < n; i++) {
std::cout << A[i] << " ";
}
return 0;
}
最初当A[j] > A[j+1]
被选中时,13 > 89 为假,flag 保持为 0 并执行 break 语句。这就是数组没有变化的原因。如其他答案中所述,您应该在第二个循环完成后检查标志。你听说过橡皮鸭调试吗?试试看。很有帮助。
我正在尝试编写一个简单的冒泡排序算法,但它不起作用。最后打印时数组不变
我已经在我的 IDE 上使用了调试工具,它告诉我第二个 for 循环没有递增,但我不知道为什么不是。
总的来说,我对学习 C++ 和算法还是陌生的,所以对此的指点会很有帮助。
这是代码,非常感谢。
#include <iostream>
int main(){
int A[] = {13, 89, 43, 74, 45, 16};
int n = sizeof(A)/sizeof(*A);
for (int i=0; i<n; i++) { //pass through the algorithm n-1 times
int flag = 0;
for (int j=0; j<n-i-1; j++) { //optimise checks, avoid checking sorted part of array
if (A[j] > A[j+1]) {
int temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
flag = 1; //shows a swap happened
}
if (flag == 0) { //no swaps have occurred so the loop is over
break;
}
}
}
for (int i = 0; i < n; i++) {
std::cout << A[i] << " ";
}
return 0;
}
你的算法有误。您应该在 flag
第二个循环完成后 检查
int flag = 0;
for (int j=0; j<n-i-1; j++) { //optimise checks, avoid checking sorted part of array
if (A[j] > A[j+1]) {
int temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
flag = 1; //shows a swap happened
}
}
if (flag == 0) { //no swaps have occurred so the loop is over
break;
}
事实上,您在第二个循环之前初始化标志,但在第二个循环中检查它应该是一个线索,表明某些地方不太正确。所以应该让调试器告诉你第二个循环没有递增。
有时,当您查看自己的代码时,您只会看到您认为自己编写的内容,而不是您实际编写的内容。客观地看自己的代码是需要培养自己的习惯。
只有一个错误:
if (flag == 0) { //no swaps have occurred so the loop is over
break;
}
这应该在第二个 for 循环之外。
#include <iostream>
int main(){
int A[] = {13, 89, 43, 74, 45, 16};
int n = sizeof(A)/sizeof(*A);
for (int i=0; i<n; i++) { //pass through the algorithm n-1 times
int flag = 0;
for (int j=0; j<n-i-1; j++) { //optimise checks, avoid checking sorted part of array
if (A[j] > A[j+1]) {
int temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
flag = 1; //shows a swap happened
}
}
if (flag == 0) { //no swaps have occurred so the loop is over
break;
}
}
for (int i = 0; i < n; i++) {
std::cout << A[i] << " ";
}
return 0;
}
最初当A[j] > A[j+1]
被选中时,13 > 89 为假,flag 保持为 0 并执行 break 语句。这就是数组没有变化的原因。如其他答案中所述,您应该在第二个循环完成后检查标志。你听说过橡皮鸭调试吗?试试看。很有帮助。