Вопрос о моем алгоритме сортировки в C ++ - PullRequest
1 голос
/ 10 июня 2010

у меня есть следующий код на 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 ]

5 голосов
/ 10 июня 2010

Вы должны объявить свою версию swap, прежде чем использовать ее. Поскольку компилятор не видел объявление, он использовал тот, который нашел в пространстве имен std. Кроме того, вы неправильно набрали qsort5 (без 5 в последней строке функции). Опять же, компилятор нашел функцию с таким именем (но с другой подписью) в std и пожаловался.

Вы должны либо переместить все определение swap в положение перед функцией qsort5, либо вставить объявление

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

до qsort5.

4 голосов
/ 10 июня 2010

swap - это функция в std, которая должна быть включена в <iostream>. Когда вы пытаетесь позвонить вашему swap, он не может его найти (я сейчас объясню) и вместо этого смотрит на std::sort, который принимает два аргумента (отсюда и первую ошибку).

Причина, по которой он не может найти ваш swap, заключается в том, что он объявлен после его вызова. Вам нужно либо переместить определение вашего swap выше определения qsort5, либо объявить его вперед:

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

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

Это говорит компилятору о том, что ваша функция подкачки существует, и она будет использовать это при вызове swap с 3 аргументами.

1 голос
/ 11 июня 2010

Если это не упражнение, вы рассматривали возможность использования std::sort вместо изобретения колеса? Тогда ваша ошибка исчезнет, ​​потому что функция qsort5 может быть удалена.

1 голос
/ 10 июня 2010

Похоже, вам не хватает скобки:

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

В приведенном выше цикле, j устанавливается на ноль целую кучу раз. Это может быть упрощено (вами и будет компилятором) до:

j = 0;

В противном случае отсутствует набор скобок или что-то еще.

1 голос
/ 10 июня 2010

не используйте using namespace std;, как правило, это плохая практика.это приводит к тому, что std :: swap попадает в область видимости, поэтому компилятор выбирает этот своп, а не ваш (поскольку ваш вообще не определен).

Переместите определение вашего свопа перед его использованием.

0 голосов
/ 10 июня 2010

Возможно, вы намеревались вызвать qsort5 в конце и вместо этого вызвать qsort?

0 голосов
/ 10 июня 2010

Вы ожидаете, что ваша функция подкачки (int, int, int) будет вызвана. Однако, если вы посмотрите на ошибку, она упоминает «void std :: swap (...)». Это потому, что вы using namespace std, а ваша функция подкачки объявлена ​​ниже qsort5.

Так что он ищет функцию подкачки и может видеть только std: swap. Попробуйте поставить свою функцию подкачки выше qsort5, чтобы она тоже могла это видеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...