Domanda sul mio algoritmo di ordinamento in C ++
Domanda
Ho seguente codice in 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;
}
ho 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"
Si prega di aiutare
Soluzione
swap
è una funzione in std
che deve essere incluso per <iostream>
. Quando si tenta di effettuare chiamate al vostro swap
, non può trovare (ti spiego in un attimo) e invece guarda il std::sort
, che prende due argomenti (da qui il primo errore).
Il motivo per cui non riesce a trovare il tuo swap
è perché è stata dichiarata dopo che è stato chiamato. È necessario spostare sia la definizione del vostro swap
superiore a quella del qsort5
o in avanti dichiararlo:
void swap(int i,int j,int a[]);
void qsort5(int a[],int n){
...
che dice al compilatore che la funzione di scambio esiste e userà che quando si chiama swap
con 3 argomenti.
Altri suggerimenti
Si deve dichiarare la vostra versione di swap
prima di usarla. Dal momento che il compilatore non ha visto una dichiarazione, ha usato quella che trovò nello spazio dei nomi std
. Inoltre, è mispelled qsort5
(omettendo il 5 nell'ultima riga della funzione). Anche in questo caso, il compilatore ha trovato una funzione con lo stesso nome (ma una firma diversa) in std
e si lamentava.
Si dovrebbe spostare sia l'intera definizione di swap
ad una posizione prima della funzione di qsort5
o inserire una dichiarazione
void swap(int i,int j,int a[]);
prima qsort5
.
Non utilizzare using namespace std;
, è generalmente cattiva pratica. questo porta std :: scambio in ambito, scelte in modo compilatore up che scambio, anziché tua (dal vostro non è definita affatto questo punto).
definizione Sposta del vostro scambio prima di utilizzarlo.
Sembra che mancano una parentesi:
for (i=1;i<n;i++)
j=0;
Nel ciclo precedente, j
viene azzerato un sacco di volte. Questo può essere semplificata (da voi e sarà dal compilatore) a:
j = 0;
In caso contrario, v'è un insieme di parentesi graffe mancante o qualcos'altro.
A meno che questo è un esercizio, Hai pensato di usare std::sort
invece di reinventare la ruota? Poi l'errore va via perché la funzione qsort5
può essere rimosso.
vi aspettate lo swap (int int, int) funzione da chiamare. Tuttavia, se si guarda l'errore, si parla 'std :: vuoto swap (...)'. Questo è perché siete using namespace std
, e la funzione di swap viene dichiarato sotto qsort5.
Quindi sembra per una funzione di scambio, e può vedere solo std: swap. Prova a mettere la vostra funzione di scambio sopra qsort5 modo che possa vedere che uno pure.
Hai forse intenzione di chiamare qsort5 alla fine, e chiamare qsort invece?