这个题目隐约是在某个博客上看到过,后来书签掉了,一直找不到原文,所以只好自己写了一个解法,但愿没有出错。
题目描述
已知一个字符数组,其中存储有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)其实还有一个只需要遍历一遍数组的方法