关于我在C ++中排序算法的问题

时间:2010-06-10 18:38:26

标签: c++ algorithm quicksort

我在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"

请帮助

7 个答案:

答案 0 :(得分:5)

在使用之前,您必须声明swap的版本。由于编译器没有看到声明,因此它使用了它在std命名空间中找到的声明。另外,你拼错qsort5(省略函数最后一行的5)。同样,编译器在std中找到了一个具有该名称(但不同的签名)的函数并抱怨。

您应该将swap的整个定义移动到函数qsort5之前的位置或插入声明

void swap(int i,int j,int a[]);
qsort5之前

答案 1 :(得分:4)

swapstd中的一项功能,必须包含在<iostream>中。当你试图调用你的swap时,它找不到它(我稍后会解释),而是查看std::sort,它带有两个参数(因此第一个错误)

找不到swap的原因是因为它是在调用之后声明的。您需要将swap的定义移到qsort5之上,或者向前声明它:

void swap(int i,int j,int a[]);

void qsort5(int a[],int n){ 
  ...

告诉编译器您的交换函数存在,当您使用3个参数调用swap时,它将使用它。

答案 2 :(得分:1)

不要使用using namespace std;,一般都是不好的做法。这会将std :: swap带入范围,因此编译器会选择交换,而不是你的交换(因为你的所有这一点都没有定义)。

在使用之前移动交换的定义。

答案 3 :(得分:1)

看起来你错过了一个大括号:

for (i=1;i<n;i++)
    j=0;

在上面的循环中,j被设置为零一大堆。这可以简化(由您和将由编译器完成):

j = 0;

否则会有一组丢失的大括号或其他内容。

答案 4 :(得分:1)

除非这是练习,否则您是否考虑使用std::sort而不是重新发明轮子?然后你的错误就消失了,因为qsort5功能可以删除。

答案 5 :(得分:0)

您期望调用swap(int,int,int)函数。但是,如果你看一下错误,它会提到'void std :: swap(...)'。这是因为你是using namespace std,你的交换函数声明在qsort5以下。

所以它寻找交换功能,只能看到std:swap。尝试将交换函数放在qsort5上方,这样它也可以看到那个。

答案 6 :(得分:0)

您是否打算最后调用qsort5,而是调用qsort?