我正在尝试编写自己的冒泡排序算法作为练习。我不明白这两条错误信息。有人能指出我代码的问题吗?
// 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;
}
}
我看到您正在使用
using namespace std;
所以当你输入时
array[i] = swap;
编译器无法消除您引用的是std::swap
函数还是int swap
变量的歧义。事实上,它似乎假设您引用了该函数,并试图以某种方式将其转换为类型int
。尝试将变量重命名为其他变量。
一般来说,尽量远离using
指令,以避免像这样的名称冲突。
array[i] = swap;
这条线路出了问题。最好更改swap
局部变量的名称,因为在std
命名空间中已经存在具有相同名称的函数,该命名空间由using namespace std;
行带入范围,无论如何都要避免。
我还建议您在if块内声明变量,其中实际使用:
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
命名空间中定义的函数。
cout << "Sorted: " << bubbleSort(array, arraySize);
函数的返回类型为void
。没有什么可打印的。如果需要打印排序后的数组,则需要在函数调用后对数组元素进行迭代。