c语言的一个字符串排序

img

定义一个数组int zm[26],记录字母出现的次数,
定义一个char数组 char cc[26],值是从a-z
统计完字母的次数后,根据次数多少排序,cc数组随之排序.


代码如下:

#include <stdio.h>
int main()
{
    char buf[100];
    int i,j,t;
    int zm[26]={0}; //字母对应的数量
    char cc[26];
    char ch;
    for(i=0;i<26;i++)
        cc[i] = 'a'+i;
    gets(buf);//读取一行字符串
    i=0;
    while (buf[i] != '\0')
    {
        if(buf[i]>='a' && buf[i]<='z')
            zm[buf[i]-'a'] += 1;
        else if(buf[i]>='A' && buf[i]<='Z')
            zm[buf[i]-'A'] += 1;
        i++;
    }
    //排序
    for (i=0;i<25;i++)
    {
        for (j=0;j<25-i;j++)
        {
            if(zm[j] < zm[j+1])
            {
                t = zm[j];
                zm[j]=zm[j+1];
                zm[j+1]=t;
                
                ch = cc[j];
                cc[j] = cc[j+1];
                cc[j+1]=ch;
            }
        }
    }
    //输出
    for(i=0;i<26;i++)
    {
        if(zm[i] > 0)
        {
            printf("%c %d\n",cc[i],zm[i]);
        }
    }
    return 0;
}

维护一个二维数组,第一行存放每个字母的索引(0到25或1到26),第二行初始化为0
读入字符串,每读到一个字母,就将数组第二行对应位置+1
依据二维数组的第二行对二维数组排序,排序时两个维度同步交换
排序后,按照二维数组第一维的顺序输出对应的字母即可