Как реализовать подсчет сортировки для сортировки массива символов в C?

#arrays #c #sorting #counting-sort

#массивы #c #сортировка #подсчет-сортировка

Вопрос:

Итак, я пытаюсь реализовать алгоритм подсчета сортировки для сортировки массива цифр, заданных пользователем, вот мой код:

 #include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int i,n=15;
    char arr[]={"ABEFGEAGCEDBFAC"}; //I'm using this string to test it out
    /*for(int i=0; i<n; i  ){
        printf("Insert a letter %d: ",i 1);
        scanf("%c",amp;arr[i]);
        fflush(stdin);
    }
    */
    printf("Array: n[ ");
    for(i=0; i<n; i  ){
        if(i<n-1)
            printf("%c | ",arr[i]);
        if(i==n-1)
            printf("%c ]n",arr[i]);
    }
    printf("n");
    int range[7];
    for(i=0;i<7;i  ){
        range[i]=0;
    }
    for(i=0; i<n; i  ){ //I've seen other ways to do this, but I just need it to go from A-G
                        //not sure if this is the problem.
        switch(arr[i]){
            case 'A':
                range[0]  ;
                break;
            case 'B':
                range[1]  ;
                break;
            case 'C':
                range[2]  ;
                break;
            case 'D':
                range[3]  ;
                break;
            case 'E':
                range[4]  ;
                break;
            case 'F':
                range[5]  ;
                break;
            case 'G':
                range[6]  ;
                break;
        }
    }

    printf("Counting array (number of times it appear in the array): n[ ");
    for(i=0; i<7; i  ){
        if(i<6)
            printf("%d | ",range[i]);
        if(i==6)
            printf("%d ]n",range[i]);
    }
    printf("n");

    for(i=1;i<7;i  ){ //Here I do the sum of all elements in the array
        range[i] = range[i]   range[i-1];
    }

    printf("Sum of the array: n[ ");
    for(int i=0; i<7; i  ){
        if(i<6)
            printf("%d | ",range[i]);
        if(i==6)
            printf("%d ]n",range[i]);
    }
    printf("n");
    char ord[15];

    for(i=n-1;i>=0;i--)
        ord[--range[arr[i] - 'A']] = arr[i];
    for (i=0;i<n;i  ){
        printf("%c ",ord[i]);
    }
/*
    printf("Ord: n[ ");
    for(int i=0; i<15; i  ){
        if(i<14)
            printf("%c | ",ord[i]);
        if(i==14)
            printf("%c ]n",ord[i]);
    }
*/
}

  

Итак, как вы можете видеть, если я не ошибаюсь, ошибка заключается в том, что я пытаюсь поместить каждую букву в правильное положение, используя массив range в предпоследнем предложении for . Я видел другие способы его реализации, но я просто не могу это сделать, он падает, как только я пытаюсь напечатать ord[i] .
Мне трудно полностью понять, что происходит в этом.

Обновить:
Попытался реализовать исправления fish-404 в коде, как показано выше. Не удается правильно реализовать его.

Последнее обновление:
Приведенный выше код теперь завершен и полностью функционален. Спасибо @fish-404 .

Ответ №1:

В этой строке arr[i] это символ, вы пытаетесь использовать символ в качестве индекса массива range .

 ord[range[arr[i]]] = arr[i];
  

Обновить

Если я вас правильно понял, я думаю, вы хотите использовать arr[i] символ в качестве индекса для поиска в range массиве.

Как вы можете видеть, range используемый вами массив подсчитывает букву, чтобы использовать букву для индексации, вы просто используете arr[i]-'A' для подсчета порядка букв в range массиве.

 for (i = n; i >= i; i--)
  ord[--range[arr[i] - 'A']] = arr[i];

// use this to see result
for (i = n;i >= 1; i--)
  printf("i: %d, ord[i]: %cn", i, ord[i-1]);
  

Комментарии:

1. Спасибо за публикацию, поскольку я изучал эту строку, я тоже понял это! :).

2. Я должен спросить, знаете ли вы, как я могу это реализовать ?. range — это массив целых чисел, поэтому он может хранить позицию индекса, где каждая буква должна быть на месте в конечном массиве, так как я могу использовать его для упорядочивания ord ?

3. @Chriss Привет, я обновляю anwser, посмотрите, что вы хотите.

4. Привет, у меня возникли проблемы при попытке реализовать ваши исправления. Обновлен основной вопрос.

5. @Chriss Привет, после char odr[15] того, как вы просто воспользуетесь инструкцией, которую я опубликовал выше, для тестирования, вам не нужны оригинальные другие инструкции.