如何实现计数排序以在 C 中对 char 数组进行排序?
How to implement Counting Sort to sort an array of char in 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",&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]);
}
*/
}
因此,如您所见,如果我没记错的话,错误是当我尝试使用倒数第二个范围数组将每个字母放在正确的位置时 for句。我见过其他实现它的方法,但我就是无法完成它,当我尝试打印 ord[i] 时它就崩溃了。
我无法完全理解 for.
中发生的事情
更新:
尝试对代码实施 fish-404 的更正,如上所示。无法正确实施。
最后更新:
上面的代码现在已经完成并且功能齐全。感谢@fish-404 .
这一行,arr[i]
是一个char,你尝试用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]);
所以,我正在尝试实现计数排序算法来对用户给出的数字数组进行排序,这是我的代码:
#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]);
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]);
}
*/
}
因此,如您所见,如果我没记错的话,错误是当我尝试使用倒数第二个范围数组将每个字母放在正确的位置时 for句。我见过其他实现它的方法,但我就是无法完成它,当我尝试打印 ord[i] 时它就崩溃了。 我无法完全理解 for.
中发生的事情更新:
尝试对代码实施 fish-404 的更正,如上所示。无法正确实施。
最后更新:
上面的代码现在已经完成并且功能齐全。感谢@fish-404 .
这一行,arr[i]
是一个char,你尝试用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]);