C++ 选择排序小联系

#include <iostream>
/*
输入一行字符串仅由小写字母所构成。 输出为一行,按 aa, bb, cc, …, zz 在字符串中的出现次数按从多到少, 将 aa, bb, cc, …, zz 排序,不同字母间以一个空格隔开,忽略行末空格。 阐述: 1.计算出现次数时是可重叠的,即在字符串 "aaaa" 中,aa 出现了三次 2.若出现次数相同,则按照字典序升序排列,比如若是ee,dd 都出现 1 次,则 dd 放在 ee 前面 3.若aa, bb, cc, …, zz 都没有出现过,则什么都不用输出 例:输入bbaaqccc,则输出cc aa bb (选择合适的排序方式,完成这个题目)
*/
void  test(char* buf)
{
    int a[26] = { 0 }; //定义一个数组存放叠字母的数量
    for (int i = 0; i < strlen(buf) - 1; i++)
    {
        if (buf[i] == buf[i + 1])
        {
            a[buf[i] - 'a']++;   //将叠字母a-z按照0-25的方式存入数组中,并按照出现的次数自加1
        }
    }

    for (int i = 0; i < 26; i++)
    {
        int max = 0, max_id;     //定义出现的次数的大小,初始为0,次数对应的下标
        for (int j = 0; j < 26; j++)
        {
            if (a[j] > max)  // a[26]中存放叠字母出现的频次,如果当前出现的次数大于初始值,进入循环
            {
                max = a[j]; //如果当前出现的次数大于初始值,则将最大值赋值给max,并将该次循环的下标赋值给max_id
                {
                    max = a[j];
                    max_id = j;
                }
            }            
        }
        if (max == 0) return; //如果第一轮下来发现不存在叠字母,则自动退出
        if (i != 0) printf(" ");
        printf("%c%c", max_id + 'a', max_id + 'a');  //打印对应的叠字母,对应的max_id的值+'a'为叠字母,
        a[max_id] = 0; //将数组中存放的值置空,防止循环利用,在用剩下的值进行对比
    }
}


int main()
{

    char buf[] = "aabbqccc"; 
    test(buf);
    return 0;
}

 

posted @ 2020-03-21 11:49  神迹丶  阅读(241)  评论(0编辑  收藏  举报
网站已运行: