c ++ max выбирая сортировку - PullRequest
       1

c ++ max выбирая сортировку

1 голос
/ 18 ноября 2011

Я начал изучать с ++. (Я изучаю прикладную математику в школе) И я должен изучать программирование. Я только что написал максимальный выбор сортировки в C ++. Он должен печатать элементы предопределенного массива в порядке убывания, но он не работает. Можете ли вы сказать мне, где я ошибся?

int* max(int *array)
{
    int *max = array++;
    while(*array)
    {
    if (*max<*array) *max = *array;
    array++;
    }
    return max;
}

void change (int *what, int *to)
{
int *temp = what;
what =to;
to = temp;
}

void sort(int *array)
{
while(*array) change(array,max(array));
array++;
}


int _tmain(int argc, _TCHAR* argv[])
{
    int A[] ={7,5,6,9,2,5,3,1,4,10,6,7,2,8};

    sort (A);
    int i =0;
    while (A[i]) cout<<A[i++];

    getchar();
    return 0;
}

Ответы [ 4 ]

4 голосов
/ 18 ноября 2011

Первая проблема, которую я вижу, заключается в том, что while (*array) { ... } не будет завершаться там, где вы хотите, потому что то, что находится за пределами последнего элемента вашего массива, не обязательно будет 0 или NULL, или оно может завершиться в середине вашего массив, если вы сортируете массив, который включает 0.

Вместо этого вы хотите сказать что-то вроде:

int A[] = { ... };
int element_count = sizeof(a)/sizeof(a[0]);
for (int i = 0; i < element_count; ++i) { ... }
2 голосов
/ 18 ноября 2011

Вторая проблема заключается в том, что array++; в функции sort() не является частью цикла while.Я не удивлюсь, если это никогда не выйдет.

2 голосов
/ 18 ноября 2011

Похоже, вы поменялись понятиями указателей и значений.Например, ваша change функция, как и сейчас, имеет значение

void change (int *what, int *to)
{
    int *temp = what;
    what =to;
    to = temp;
}

, когда она должна быть

void change (int *what, int *to)
{
    int temp = *what;
    *what = *to;
    *to = temp;
}

, что почти с точностью до наоборот.

Есть также несколько неправильных указателей в функции max, которые я вижу, так же как и в функции sort, и это то, что я вижу только после очень короткого взгляда на код.Вам нужно вернуться и выучить указатели, а затем повторить попытку.

0 голосов
/ 18 ноября 2011

Я бы попытался явно показать, что вы пытаетесь сделать, используя правильный тип; например:

while (*array)
{
    ...
}

было бы намного легче отладить, если бы он сказал что-то вроде

while (array != NULL)

или даже

for (int k=0; k<n; k++)
{
    // do something with array[k]
}

Кроме того, ваша функция change выглядит так, как будто она должна поменять два значения, на которые указывают указатели, но это не так.

На всякий случай, если это поможет, я думаю, что техническое название того, что вы делаете, называется " Selection Sort ". Это может помочь, если вам нужно попросить кого-нибудь еще за советом!

Удачи!

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