关于我在 C++ 中的排序算法的问题
Posted
技术标签:
【中文标题】关于我在 C++ 中的排序算法的问题【英文标题】:Question about my sorting algorithm in C++ 【发布时间】:2010-06-10 18:38:25 【问题描述】:我在 C++ 中有以下代码
#include <iostream>
using namespace std;
void qsort5(int a[],int n)
int i;
int j;
if (n<=1)
return;
for (i=1;i<n;i++)
j=0;
if (a[i]<a[0])
swap(++j,i,a);
swap(0,j,a);
qsort5(a,j);
qsort(a+j+1,n-j-1);
int main()
return 0;
void swap(int i,int j,int a[])
int t=a[i];
a[i]=a[j];
a[j]=t;
我有问题
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(13) : error C2780: 'void std::swap(std::basic_string<_Elem,_Traits,_Alloc> &,std::basic_string<_Elem,_Traits,_Alloc> &)' : expects 2 arguments - 3 provided
1> c:\program files\microsoft visual studio 9.0\vc\include\xstring(2203) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(13) : error C2780: 'void std::swap(std::pair<_Ty1,_Ty2> &,std::pair<_Ty1,_Ty2> &)' : expects 2 arguments - 3 provided
1> c:\program files\microsoft visual studio 9.0\vc\include\utility(76) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(13) : error C2780: 'void std::swap(_Ty &,_Ty &)' : expects 2 arguments - 3 provided
1> c:\program files\microsoft visual studio 9.0\vc\include\utility(16) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(14) : error C2780: 'void std::swap(std::basic_string<_Elem,_Traits,_Alloc> &,std::basic_string<_Elem,_Traits,_Alloc> &)' : expects 2 arguments - 3 provided
1> c:\program files\microsoft visual studio 9.0\vc\include\xstring(2203) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(14) : error C2780: 'void std::swap(std::pair<_Ty1,_Ty2> &,std::pair<_Ty1,_Ty2> &)' : expects 2 arguments - 3 provided
1> c:\program files\microsoft visual studio 9.0\vc\include\utility(76) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(14) : error C2780: 'void std::swap(_Ty &,_Ty &)' : expects 2 arguments - 3 provided
1> c:\program files\microsoft visual studio 9.0\vc\include\utility(16) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(16) : error C2661: 'qsort' : no overloaded function takes 2 arguments
1>Build log was saved at "file://c:\Users\dato\Documents\Visual Studio 2008\Projects\qsort5\qsort5\Debug\BuildLog.htm"
请帮忙
【问题讨论】:
你试过把"void swap(..." before "void qsort5(..."吗? 这真的和算法没什么关系,更别说快速排序了...... 【参考方案1】:您必须在使用之前声明您的swap
版本。由于编译器没有看到声明,它使用了它在 std
命名空间中找到的声明。此外,您拼错了qsort5
(省略了函数最后一行中的 5)。再次,编译器在std
中发现了一个具有该名称(但签名不同)的函数并抱怨。
您应该将swap
的整个定义移动到函数qsort5
之前的位置,或者插入一个声明
void swap(int i,int j,int a[]);
在qsort5
之前。
【讨论】:
是的,但它只显示一个错误 1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(26) : error C2660: 'qsort' : 函数不接受 2 个参数 @davit-datuashvili:标准库的 qsort 函数需要 4 个参数。你只提供了两个。 或者更可能的是,您的意思是qsort5
而不是 qsort
。【参考方案2】:
swap
是std
中的一个函数,必须包含在<iostream>
中。当您尝试调用您的swap
时,它找不到它(我稍后会解释),而是查看std::sort
,它需要两个参数(因此第一个错误)。
它找不到你的swap
的原因是因为它是在调用之后声明的。您需要将swap
的定义移至qsort5
的定义之上或转发声明:
void swap(int i,int j,int a[]);
void qsort5(int a[],int n)
...
这告诉编译器你的交换函数存在,当你用 3 个参数调用 swap
时它会使用它。
【讨论】:
std::swap
在<algorithm>
,而不是<iostream>
。
是的,但正如我所说,它必须包含在<iostream>
中,否则不会显示该错误。没有什么可以阻止这些标头包含其他标头。【参考方案3】:
不要使用using namespace std;
,通常是不好的做法。这会将 std::swap 带入范围,因此编译器会选择该交换,而不是您的(因为此时尚未定义您的)。
在使用之前移动交换的定义。
【讨论】:
+1 引入“使用标准”会带来很多这样的问题。如果您对 std 库足够了解,您可以快速掌握这些内容,但使用 std 的人通常是初学者,后来学会避开它。【参考方案4】:你好像少了一个大括号:
for (i=1;i<n;i++)
j=0;
在上面的循环中,j
被设置为零很多次。这可以(由您并将由编译器)简化为:
j = 0;
否则会缺少一组大括号或其他东西。
【讨论】:
大声笑,是的,我也看到了,非常困惑:)【参考方案5】:除非这是一个练习,否则您是否考虑过使用std::sort
而不是重新发明***?然后你的错误就消失了,因为 qsort5
函数可以被删除。
【讨论】:
【参考方案6】:您希望调用您的 swap(int,int,int) 函数。但是,如果您查看错误,它会提到“void std::swap(...)”。这是因为你是using namespace std
,并且你的swap函数声明在qsort5下面。
所以它寻找一个交换函数,并且只能看到std:swap。试着把你的交换函数放在 qsort5 上面,这样它也能看到那个。
【讨论】:
【参考方案7】:您是否打算在最后调用 qsort5,而改为调用 qsort?
【讨论】:
以上是关于关于我在 C++ 中的排序算法的问题的主要内容,如果未能解决你的问题,请参考以下文章