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