我正在尝试将自己的冒泡排序算法编写为练习。我不明白这两个错误消息。任何人都可以用我的代码指出问题吗?
// Bubble sort algorithm
#include <iostream>
#include <iomanip>
using namespace std;
void bubbleSort(int array[], int arraySize); // bubbleSort prototype
int main(void)
{
const int arraySize = 10;
int array[arraySize] = {2,3,6,5,7,8,9,3,7,4};
cout << "Unsorted: ";
for(int i = 0; i < arraySize; ++i)
cout << setw(5) << array[i];
cout << "Sorted: " << bubbleSort(array, arraySize);
}
void bubbleSort(int array[], int arraySize)
{
const int max = arraySize;
int swap = 0;
for(int i = 0; i < max; ++i)
{
if(array[i] > array[i + 1])
{
swap = array[i + 1];
array[i + 1] = array[i];
array[i] = swap;
}
else
break;
}
}
答案 0 :(得分:7)
我看到你正在使用
using namespace std;
所以当你输入
array[i] = swap;
编译器无法消除您是指代std::swap
函数还是int swap
变量的歧义。事实上,它似乎假设您指的是该函数,并尝试以某种方式将其转换为int
类型。尝试将变量重命名为其他内容。
一般情况下,尽量远离using
指令,以避免像这样的名称冲突。
答案 1 :(得分:2)
array[i] = swap;
此行导致问题。最好更改swap
局部变量的名称,因为在std
命名空间中已经存在一个具有相同名称的函数,该命名空间由行using namespace std;
引入范围。无论如何都要避免。
我还建议您在if-block中声明变量,其中实际使用:
if(array[i] > array[i + 1])
{
//declare temp here where it is actually used!
int temp = array[i + 1];
array[i + 1] = array[i];
array[i] = temp;
}
最佳实践:通过延迟声明来减少范围局部变量,这意味着将它们声明为实际使用的位置。不要在函数的开头声明它们。
解决代码问题的另一种方法是给编译器一个上下文,你可以这样做(虽然我不会建议这个解决方案;它只适合你知道):
array[i] = (int)swap; //giving compiler contextual type information
当您将swap
强制转换为int
时,编译器可以知道swap
引用局部变量,而不是std
命名空间中定义的函数。
答案 2 :(得分:1)
cout << "Sorted: " << bubbleSort(array, arraySize);
函数的返回类型是void
。没有什么可以打印的。如果需要打印已排序的数组,则需要在函数调用后迭代数组元素。