【问题标题】:How to implement Counting Sort to sort an array of char in C?如何实现计数排序以在 C 中对 char 数组进行排序?
【发布时间】:2020-10-16 01:25:51
【问题描述】:

所以,我正在尝试实现计数排序算法来对用户给出的数字数组进行排序,这是我的代码:

#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。

【问题讨论】:

    标签: arrays c sorting counting-sort


    【解决方案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]: %c\n", i, ord[i-1]);
    

    【讨论】:

    • 感谢您发布此内容,因为我正在研究这一行,我也想通了! :)。
    • 我要问你是否知道我该如何实现它? range 是一个整数数组,因此它可以存储每个字母必须在最终数组中的索引位置,那么如何使用它来订购 ord
    • @Chriss 你好,我更新了anwser,看看你想要什么。
    • 您好,我在尝试执行您的更正时遇到了问题。更新了主要问题。
    • @Chriss 您好,char odr[15] 之后,您只需使用我在上面发布的语句进行测试,您不需要原始的其他语句。
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    相关资源
    最近更新 更多