【问题标题】:Sort a character array in ascending order using Counting sort使用计数排序按升序对字符数组进行排序
【发布时间】:2020-04-28 13:36:32
【问题描述】:
Input char a[10] = {'c','b','c','d','E','C','a','A','b','C'};

输出:A a b b C C c c d e

我得到了一个字符数组,我必须按升序对其进行排序,并且我必须使用计数排序来做到这一点

到目前为止我已经尝试过:

#include <stdio.h>
#include <stdlib.h>
#define RANGE 255


void countingSort(char a[], char b[], int n) // a = array, b = empty array, n = size
{
    int i;

    int c[RANGE +1];
    memset(c, 0, sizeof(c));


    for( i = 0; i< n; i++)
    {
        c[a[i]] = c[a[i]] + 1;
    }
    for(i = 1; i<RANGE; i++)
    {
        c[i] = c[i] + c[i-1];
    }
    for(i = n-1; i>=0; i--)
    {
        b[c[a[i]] - 1] = a[i];
        c[a[i]] = c[a[i]] - 1;
    }

}

int main()
{
    char a[10] = {'c','b','c','d','E','C','a','A','b','C'};
    int n = 10;
    char b[10];
    int i;
    for( i = 0; i<n;i++)
    {
        printf("%c",a[i]);
    }
    printf("\n");
    countingSort(a,b,n);
    for( i = 0; i<n;i++)
    {
        printf("%c",b[i]);
    }
    printf("\n");

    return 0;
}

我已经使用 ASCII 表对数组进行排序,我的输出是

ACCEabbccd

我设法按升序对数组进行了排序,但我不知道如何在 A 之后放置一个等等。

【问题讨论】:

  • 必须在未经编辑的情况下使用countingSort(),然后在调用countingSort() 后应用代码或者countingSort() 可以更改吗?
  • countingSort() 可以编辑,但必须在程序中。其实我们是在课堂上学习计数排序算法,所以需要在代码中实现。

标签: c arrays sorting ascii counting-sort


【解决方案1】:

一种方法只是将c[] 的大小加倍并形成一个索引,其中所有偶数索引都为大写,奇数索引为小写。

#if 1
#define RANGE (255*2 + 1)
#include <ctype.h>
#define CH_TO_INDEX(ch) \
    (2*toupper((unsigned char)ch) + !!islower((unsigned char) ch))

#else
// Original
#define RANGE 255
#define CH_TO_INDEX(ch)    (ch)

#endif

void countingSort(char a[], char b[], int n) {
  int i;
  int c[RANGE + 1];
  memset(c, 0, sizeof(c));

  for (i = 0; i < n; i++) {
    //c[a[i]] = c[a[i]] + 1;
    c[CH_TO_INDEX(a[i])]++;
  }
  for (i = 1; i < RANGE; i++) {
    c[i] = c[i] + c[i - 1];
  }
  for (i = n - 1; i >= 0; i--) {
    // b[c[a[i]] - 1] = a[i];
    b[c[CH_TO_INDEX(a[i])] - 1] = a[i];
    // c[a[i]] = c[a[i]] - 1;
    c[CH_TO_INDEX(a[i])]--;
  }
}

输出

cbcdECaAbC
AabbCCccdE

可以有一个更复杂的char --&gt; index,它的大小不会是c[] 的两倍。这种映射倾向于假设只有字母 A-Z。这样的映射可以使用辅助映射数组:

unsigned char map[256] - {
    0, 1, 2, ...., 31, ' ', ... 'A', 'a', 'B', 'b', ... 'Z', 'z', 
    ASCII characters after 'Z' and before 'a'
    ASCII characters after 'z', .... 255 };

请求操作

Output : A a b b C C c c d e

但基于{'c', 'b', 'c', 'd', 'E', 'C', 'a', 'A', 'b', 'C'},我认为OP想要

Output : A a b b C C c c d E

请注意,a[i] &lt; 0 时原始代码会失败。代码需要重新处理否定的char。使用unsigned char重新编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多