在C语言中对字符数组进行alpha排序的最简单方法是什么?

时间:2020-03-06 14:36:54  来源:igfitidea点击:

我正在寻找一种简单易懂的算法来按字母顺序对C中的字符数组进行排序。

解决方案

简单?进行气泡排序。

这是java和int而不是char,但是我们可以轻松地对其进行改编...

int[] bubble(int a[])
    {
    for (int i = a.length; --i>=0; )
        {
        for (int j = 0; j<i; j++)
            {
            if (a[j] > a[j+1])
                {
                int T = a[j];
                a[j] = a[j+1];
                a[j+1] = T;
                }
            }
        }
    return(a);
    }

C语言中的字符具有恰好是按顺序排列的数字值,因此我们只需将字符视为整数即可。 C标准库包含一个" qsort"功能。使用它(在类似linux的系统上使用man qsort)。我们可能必须将大写字母转换为小写字母以简化操作,但这很简单。如果我们想了解快速排序算法(那是我们应该学习的算法,因为我们将实际使用它),请参阅Wikipedia。

只需尝试"气泡排序",这是最简单的排序算法。

使用qsort方法:

#include <stdlib.h>

int char_compare (const void * a, const void * b)
{
  return *(const char *)a - *(const char *)b;
}

int main(){
  const char char_array[] = { 'c', 'a', 'b' };

  qsort (char_array, 3, sizeof(char), char_compare);

  return 0;
}

我想知道我们是否真的在寻找一种算法或者只是一种解决问题的方法?如果是后者,则使用C的qsort。

如果我们想使用一种算法,请选择"插入"排序或者"选择"排序,因为它们很容易理解。

如果结果是针对人类的,则最好使用strcoll。它比strcmp或者strcasecmp慢,但它说明了非英语字符。如果我们要使用它,请不要忘记为LC_COLLATE设置语言环境,即

setlocale(LC_COLLATE,"");

这是非常简单且渐近最快的(N是数组的大小):

const unsigned char in[N];
unsigned char out[N], *p=out;
size_t cnt[N]={0}, i, j;
for (i=0; i<COUNT; i++) cnt[in[i]]++;
for (i=0; i<256; i++) for (j=cnt[i]; j; j--) *p++=i;