ホームページ  >  に質問  >  本文

c++ - 用冒泡排序处理字符,要求BCAbca整理成AaBbCc。

小弟采用最基本的冒泡排序处理数组形式的字符,
只会按ASCII码整理得ABCabc的结果。
求高人指点,多谢!

PHP中文网PHP中文网2765日前817

全員に返信(5)返信します

  • PHP中文网

    PHP中文网2017-04-17 14:45:38

    把小写转大写后比较


    也不知道,踩此答案的人是什么心理~
    C语言的例子

    #include <stdio.h>
    char Upper(char c){
        if (c>='a' && c<='z'){
            c = c - ' ';//32;
        }
        return c;
    }
    void main(){
        char str[] = {"BCAbca"};
        int temp;
        int len = sizeof(str)/sizeof(char);
        len = len - 1; 
        
        printf("%s\n", str);
        for(int i = 0 ; i<len-1 ; i++){
            for(int j = 0 ; j <len - i -1 ; j++ ){
                if(Upper(str[j])>Upper(str[j+1])){ // 小写变成大写 后比较
                    temp = str[j];
                    str[j] = str[j+1];
                    str[j+1] = temp;                   
                }
            }
        }
        printf("%s\n", str);
    }

    效果:


    如何保证 ‘a’ 一定在 ‘A’ 后面?

    @brayden

    unsigned char Upper(char c){
        char isLow = (c>='a' && c<='z');
        return ((isLow ? c-32 : c) << 1) + isLow ;
    }

    返事
    0
  • PHPz

    PHPz2017-04-17 14:45:38

    一个想法是类似于将a转换成介于AB之间的一个数字 即asc码+0.5

    返事
    0
  • 怪我咯

    怪我咯2017-04-17 14:45:38

    做字符到数字的转换,示例如下:

    'A' => 0
    'a' => 1
    'B' => 2
    'b' => 3
    ...

    大概这样:

    int arr['z' - 'A' + 1];
    for (int i = 0; i < 26; i++) {
        arr[i] = 2 * i;
        arr[i + 'a'] = 2 * i + 1;
    }    

    比较 char c1, c2 即为:

    if (arr[c1 - 'A'] < arr[c2 - 'A'])

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 14:45:38

    建议学学C++。

        char str[]="BCAbca";
        auto cmp = [](char a, char b)
        {
            auto upper = [](char c)
            {
                return ( c >= 'A'&&c <= 'Z' );
            };
            auto lower = [](char c)
            {
                return ( c >= 'a'&&c <= 'z' );
            };
            if (upper(a))
            {
                if (upper(b))
                    return a < b;
                else
                    return a<b-32;
            }
            else
            {
                if (upper(b))
                    return a-32<b;
                else
                    return a < b;
            }
        };
        std::sort(str, str+6, cmp);

    返事
    0
  • 阿神

    阿神2017-04-17 14:45:38

    小弟受到答案的启发试着写了个,主要思想是把Aa到Zz这52个字母对应1到52,再通过排序即可按要求输出
    排序方法使用的是选择排序,改用冒泡也行啦
    
    #include <iostream>
    using namespace std;
    
    void out(int a[], int n)//输出整型数组
    {
        for (int k = 0; k < n; k++)
            cout << a[k] << "  ";
        cout << endl;
    }
    
    void selectsort(int a[], int n)//选择排序
    {
        int i, j, min;
        for (i = 0; i < n; i++)
        {
            min = i;
            for (j = i + 1; j < n; j++)
            {
                if (a[j] < a[min])
                {
                    min = j;
                }
            }
            swap(a[i], a[min]);
            out(a, n);//逐趟输出
        }
    }
    
    void main()
    {
        char a[11] = { 'a','f','E','c','b','n','M','d','F','N','g' };
        int b[11];
        char c[11];
        for (int i = 0; i < 11; i++)
        {
            if (a[i] >= 65 && a[i] <= 90)
            {
                b[i] = int(a[i] * 2 -129);//大写字母对应1到52中的奇数
            }
            else
            {
                b[i] = int(a[i] * 2 -192);//小写对应偶数
            }
        }
        selectsort(b, 11);
        for (int j = 0; j < 11; j++)//将整型转化回字符以输出
        {
            if (b[j] % 2 != 0)
            {
                c[j] = char((b[j] + 129) / 2);
            }
            else
            {
                c[j] = char((b[j] + 192) / 2);
            }
        }
        selectsort(b, 11);
        for (int k = 0; k < 11; k++)//输出字符数组
            cout << c[k] << "  ";
        cout << endl;
    }

    返事
    0
  • キャンセル返事