Сортировка по алфавиту в C с использованием strcmp - PullRequest
1 голос
/ 09 июля 2011

Я пытаюсь отсортировать записи (структуры) по их именам. И я использую strcmp для обмена, чтобы определить алфавитный порядок. Обмен работает нормально, однако он не всегда сортирует весь список. Он всегда оставляет некоторые записи в неправильном алфавитном порядке.

void sort_by_name(){
    printf("%d\n", counter);

    int i=0, j=0;
    patient *temp;

    for(;j<=counter;j++){
        for(;i<counter-1;i++){

            if(strcmp(pRecords[i]->name, pRecords[i+1]->name) > 0){

                temp = pRecords[i];
                pRecords[i] = pRecords[i+1];
                pRecords[i+1]=temp;

            }//if loops

        }//2nd for loop

    }//1st for loop

}


counter-- number of records in the system.

Ответы [ 2 ]

3 голосов
/ 09 июля 2011

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

0 голосов
/ 09 июля 2011

Я думаю, вы пытаетесь реализовать пузырьковую сортировку. Кажется, переменные подсчета циклов немного отключены.

        for(;i<counter-1;i++){

должно быть

        for(i=counter-2;i>=j; i--){

Вы должны сбрасывать i после каждой итерации цикла j. И работайте задом наперед, чтобы наименьшее число пузырьков было впереди.

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