问题描述
因此,我正在尝试实现Counting Sort算法来对用户给出的数字数组进行排序,这是我的代码:
#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",&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]);
}
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]);
}
*/
}
因此,如您所见,如果我没有记错的话,错误是当我尝试使用倒数第二个 for 语句中的range数组将每个字母放在正确的位置时。我已经看到了实现它的其他方法,但是我做不到,当我尝试打印ord [i]时,它就崩溃了。 我在尝试完全了解 for 中发生的事情时遇到了麻烦。
更新:
试图对上述代码执行fish-404的更正。无法正确实施。
最新更新:
上面的代码现已完成,并且可以正常运行。感谢@ fish-404。
解决方法
在这一行中,arr[i]
是一个字符,您尝试将char用作数组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]: %c\n",i,ord[i-1]);