如何在C中实现Counting Sort对char数组进行排序?

问题描述

因此,我正在尝试实现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]);