Я думаю, что ваша конкретная проблема в том, что вы не переинициализируете i
в 0 при каждом запуске внутреннего цикла.
Это относительно простая пузырьковая сортировка, в которой внутренний цикл проходит по списку N
элементов N
раз (управляется внешним циклом), чтобы отсортировать их. Но ваш внутренний цикл проходит по ним один раз, а затем кажется, что он отключается в другом месте, за пределами конца массива. Это вряд ли даст полезные результаты: -)
Ваша более общая проблема: почему вы не используете для этого языковые средства, в частности qsort
? Если вы пытаетесь научиться сортировке, это нормально, но если вы просто хотите отсортировать, нет смысла заново изобретать колесо.
Для чего бы то ни было, я предпочитаю следующий алгоритм в пузырьковой сортировке. Он останавливается рано, если список отсортирован, и не просматривает уже отсортированные элементы:
void sort_by_name(){
int i, didSwap = 1, limit = numitems - 1;
patient *temp;
while (didSwap) {
didSwap = 0;
for (i = 0; i < limit; i++) {
if (strcmp (pRecords[i]->name, pRecords[i+1]->name) > 0) {
temp = pRecords[i];
pRecords[i] = pRecords[i+1];
pRecords[i+1] = temp;
didSwap = 1;
}
}
limit--;
}
}
Переменная didSwap
определяет, когда выходить. Если вы пройдете весь несортированный раздел без замены, тогда, очевидно, вы закончили. limit
управляет этим несортированным разделом и постепенно уменьшается, поскольку после каждого прохода в конце списка появляется уже отсортированный раздел большего размера (более высокие элементы всплывают до конца списка, по одному на проход). *