Сортировка выбора C ++ по массиву структур - PullRequest
0 голосов
/ 03 марта 2012

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

Здесь моя проблема. Пока что у меня есть сортировка, правильно расставляющая счеты в порядке возрастания, но имена перемешаны. Я не смог понять почему, отчасти потому, что все еще работаю над тем, чтобы полностью понять указатели и как их использовать. Я могу правильно делать пузырьковую сортировку, сохраняя имена с их оценками, но не сортировку по выбору. Любая помощь будет принята с благодарностью.

Вот функция, которую я имею для сортировки выбора:

void selection_sort(Student *ptr, int size) // selection sort - having some problems
{
  int start,
    min_index,
    min_value;

  for (start = 0; start < (size - 1); start++) {
    min_index = start;
    min_value = (ptr+start)->score;
    for (int index = start+1; index < size; index++) {
      if ( (ptr+index)->score < min_value) {
    min_value = (ptr+index)->score;
    min_index = index;
      }
    }
    // the following line is where, i think, the problem is, but i haven't
    // been able to figure out the solution, despite trying numerous approaches
    *(ptr+min_index) = *(ptr+start);
    (ptr+start)->score = min_value;
  }
}

Так вот что у меня есть. Я тоже не очень хорошо разбираюсь в алгоритмах сортировки, и это все довольно ново для меня, так что я надеюсь, что это не ужасно запутано. Если бы кто-нибудь, знающий в этих областях, мог указать мне правильное направление, это было бы замечательно.

Ответы [ 3 ]

4 голосов
/ 03 марта 2012

Прежде всего я хотел бы дать вам один совет: вместо использования синтаксиса *(ptr+min_index) вы можете использовать ptr[min_index], и он будет иметь тот же эффект.Я считаю, что эта версия более естественная.

Второе - ваша проблема.Вам следует поменять местами ptr[min_index] и ptr[start], а не просто копировать значения одного из них в другое.Это вместо:

*(ptr+min_index) = *(ptr+start);
(ptr+start)->score = min_value;

Напишите это:

Student temp = ptr[start];
ptr[min_index] = ptr[start];
ptr[start] = temp;

Или, если вы используете c ++, просто используйте функцию подкачки:

std::swap(ptr[min_index], ptr[start]);

Зачем вамсвоп вместо того, что вы сейчас делаете?Что ж, вам следует сохранить все поля в ptr[min_index], чтобы можно было назначить их для ptr [start].

Надеюсь, это поможет.

1 голос
/ 03 марта 2012

Я думаю, вы должны использовать функцию memcpy в стандартной библиотеке ...

И еще одна вещь:

*(ptr+min_index) = *(ptr+start); 

Эта строка, кажется, перезаписывает данные, но НЕ заменяет их какони должны быть.

0 голосов
/ 03 марта 2012

Первый урок в C ++: В C ++ есть перегрузка операторов, поэтому строка вроде этой:

 *(ptr+min_index) = *(ptr+start); 

может иметь значение, если у вашего Student класса есть какой-либо указатель в его атрибутах-членах.

и вы должны использовать своп, а не просто назначать.

...