Pregunta acerca de mi algoritmo de ordenación en C ++
Pregunta
he siguiente código en 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;
}
Tengo un problema
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"
ayuda por favor
Solución
swap
es una función en std
que debe ser incluido por <iostream>
. Al intentar realizar llamadas a su swap
, no puede encontrarlo (lo explicaré en un momento) y en su lugar se ve en la std::sort
, que toma dos argumentos (de ahí el primer error).
La razón por la que no puede encontrar su swap
es porque se ha declarado después de que se llama. Es necesario mover ni en la definición de su swap
por encima de la de qsort5
o hacia adelante declare que:
void swap(int i,int j,int a[]);
void qsort5(int a[],int n){
...
Esto le dice al compilador que existe su función de intercambio y la usará cuando llame swap
con 3 argumentos.
Otros consejos
Se tiene que declarar su versión de swap
antes de usarla. Dado que el compilador no vio una declaración, que utiliza la encontró en el espacio de nombres std
. También, escrito mal qsort5
(omitiendo la 5 en la última línea de la función). Una vez más, el compilador encuentra una función con ese nombre (pero una firma diferente) en std
y se quejó.
Debe moverse ya sea toda la definición de swap
a una posición antes de qsort5
función o insertar una declaración
void swap(int i,int j,int a[]);
antes qsort5
.
No utilice using namespace std;
, es generalmente una mala práctica. esto trae std :: intercambio en alcance, selecciones de modo compilador hasta que swap, en lugar de los suyos (ya que el suyo no se define en absoluto este punto).
Mover definición de su canje antes de usarla.
Parece que faltan un aparato ortopédico:
for (i=1;i<n;i++)
j=0;
En el bucle anteriormente, j
se establece en cero un manojo entero de veces. Esto puede ser simplificada (por usted y será por el compilador) a:
j = 0;
De lo contrario hay un conjunto que falta de apoyos o algo más.
A no ser que se trata de un ejercicio, ¿ha considerado el uso de std::sort
en lugar de reinventar la rueda? Entonces su error desaparece porque la función qsort5
se puede quitar.
Usted está esperando su función de intercambio (int, int, int) para ser llamado. Sin embargo, si nos fijamos en el error, se menciona 'std :: swap de vacío (...)'. Esto se debe a que está using namespace std
, y su función de intercambio se declara a continuación qsort5.
Así que parece para una función de intercambio, y sólo puede ver std: intercambio. Trate de poner su función de intercambio por encima de qsort5 por lo que puede ver que uno también.
¿Usted tal vez la intención de llamar qsort5 al final, y llamar qsort lugar?