2012-03-03 5 views
0

Я работаю над книгой на C++, и я немного застрял в одном из проблемных вопросов. Я работаю над изучением указателей, и в этой конкретной задаче мне нужно отсортировать массив структур (используя указатели) со строкой имени ученика и двойником их оценки. После сортировки элементы данных структуры по-прежнему должны совпадать, очевидно (т. Е. Правильное имя по-прежнему должно быть с их оценками).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; 
    } 
} 

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

+0

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

ответ

4

Прежде всего, я хотел бы дать вам один совет: вместо синтаксиса *(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].

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

+0

Ahh ... вот почему значения были перезаписаны. Спасибо друг. Кроме того, вы правы, ptr [index] выглядит намного лучше. – nik

1

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

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

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

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

0

Первый урок в C++: В C++ есть перегрузки операторов, так что линия, как это:

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

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

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

Смежные вопросы