JiaWei Lee Ответов: 1

Стабильный подсчет сортировка списка в C


Как получить стабильную сортировку подсчета для массива идентификаторов, связанных со счетом
удается отсортировать один массив типа {1,3,2,1,5}, но не удается сделать это для ниже

Ввод:

int main()
{
    //Note: The sample is sorted by "student id"
    struct SResult sample[] = {
        {"A1234", 10},
        {"A1239", 5},
        {"A1394", 7},
        {"A1434", 3},
        {"A1454", 5},
        {"A2884", 7},
        {"A3235", 7},
        {"A4334", 9},
        {"A4884", 2},
        {"A6934", 5},
        {"A7265", 7},
        {"A9559", 3}
    };

    struct SResult sorted[12] = {{0}};
    int i;

    counting_sort(sample, 12, sorted);

    for (i = 0; i < 12; i++){
        printf("[%s, %d]\n", sorted[i].studentID, sorted[i].score);
    }
    printf("\n");

    return 0;
}


Что я уже пробовал:

struct SResult {
    char studentID[6];
    int score;
};


void counting_sort(struct SResult scoreArr[], int N, int final[])
{

    int freq[11] = {0}, cfreq[11] = {0};
    int i, curScore;

    //1. Compute Frquency
    for (i = 0; i < N; i++){
        freq[ scoreArr[i].score ] ++;
    }

    //2. Compute Cumulative Frequency
    cfreq[0] = freq[0];
    for (i = 1; i < 11; i++){
        cfreq[i] = cfreq[i-1] + freq[i];        
    }

    //3. Produce Final Position

    for (i = 0; i < N; i++){
        curScore = scoreArr[i].score;
        final[ cfreq[ curScore ] - 1 ]  = curScore;
        cfreq[curScore]--;
    } 

}

OriginalGriff

Что вы сделали до сих пор для создания списка, сортировки списка и т. д.?

JiaWei Lee

попробовал что такое код в разделе Что я пробовал

OriginalGriff

В этом коде нет списка - это массив.

JiaWei Lee

да это массив

OriginalGriff

Так почему же вы говорите о списках и в чем проблема, с которой вы столкнулись?
Здесь важно быть точным: помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы. Поэтому, если вы говорите о списках, мы предполагаем, что вы имеете в виду связанный список, с которым сложнее работать, чем с массивом. Скажите нам, что вы имеете в виду, и объясните, какая помощь вам нужна, и мы сделаем все, что в наших силах.

1 Ответов

Рейтинг:
1

nv3

Ваша ошибка заключается в том, что у вас есть неверное представление о том, что такое функция counting_sort делает и какие аргументы он принимает. Третий аргумент не является массивом SResult, как вы предполагаете, но массив int он содержит позиции записей после сортировки. Поэтому ваш код в main должен выглядеть следующим образом:

int sorted[12];
int i;
int k;

counting_sort(sample, 12, sorted);

for (i = 0; i < 12; i++){
    k = sorted[i];
    printf("[%s, %d]\n", sample[k].studentID, sample[k].score);
}
printf("\n");

Кроме того, очевидно, что ваш код находится только в экспериментальной стадии. Вы должны покончить с этими фиксированными массивами размером как тот для freq и cfreq В вашем counting_sort функция.