给定一个字符数组,存储有R、G、B字符,将所有字符按照RGB顺序排序

这个题目隐约是在某个博客上看到过,后来书签掉了,一直找不到原文,所以只好自己写了一个解法,但愿没有出错。

题目描述

已知一个字符数组,其中存储有R、G、B字符,要求将所有的字符按照RGB的顺序进行排序。比如给定一个数组为char s[] = "RGBBRGGBGB",则排序后应该为RRGGGGBBBB。

 

分析

解法1)这个题目有点类似于快速排序中用到的划分数组的方法,但是这里有三个字符,因此需要调用划分方法两次,第一次以'B' 划分,第二次以'G'划分,这样两次划分后就可以将原来的字符数组划分成RGB顺序。这个方法比较自然,容易想到,代码如下。这个方法的缺点是需要遍历两遍数组。

/*划分函数*/
void partition(char *a, int lo, int hi, char t)
{
    int m = lo-1;
    for (int i=lo; i<=hi; i++) {
        if (a[i] != t) {
            swap(a, ++m, i);
        }
    }
}

/*主函数*/
void sort(char *a)
{ 
    int len = strlen(a);
    partition(a, 0, len-1, 'G');  //以G划分
    partition(a, 0, len-1, 'B');  //以B划分
}


解法2)其实还有一个只需要遍历一遍数组的方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值