RGB排序

RGB排序,一个字符串,里面只有三种字符R G B,所有的R都在G的前面,
所有的G都在B的前面。将给定字符串按照此规律排序。

要求不允许用辅助空间,
复杂度控制在O(N)。

(该题O(2N)的情况话,直接统计RGB俩个出现的个数,在统一赋值!感觉此种方法也合适!) 不允许使用额外辅助空间,能用下标,或指针吗?疑惑

如下解法用到了俩对下标,也不知道是否是辅助空间,囧!

解题思路:

类似快排中的区间划分,将R放在左边,B放在右边。

的注意特殊情况,全是R,或全是B,全是G.

另一位仁兄的思路:http://blog.csdn.net/smilestone_322/article/details/8038675

#include <iostream>
#include <cstdlib>
using namespace std;

void rgb_sort(char *array,unsigned int n);

int main()
{			  //RRRRRGGGGGBBBB
	char a[] = "BRGGGRRBBGRBRG";
			  //RRRRRGGGGGGGBBBBB
	char b[] = "GBRRRGBBGBRRBGGGG";
	          //RRRRRRRRGGGGGBBBBBB
	char c[] = "BBRRRGBBGBRRBGGGRRR";
			  //GGGGGGGGGGGGGGGGGG
	char d[] = "GGGGGGGGGGGGGGGGGG";
			  //RRRRRRRRRRRRRRRRR
	char e[] = "RRRRRRRRRRRRRRRRR";
			  //BBBBBBBBBBBBBBBBB
	char f[] = "BBBBBBBBBBBBBBBBB";
			  //RRRRRRRRRGGGBBBBBBBBB
	char g[] = "BBRRRBBBRBBGRGGBRBRRR";
	rgb_sort(a,strlen(a));
	cout<<"1:"<<a<<endl;
	rgb_sort(b,strlen(b));
	cout<<"2:"<<b<<endl;
	rgb_sort(c,strlen(c));
	cout<<"3:"<<c<<endl;
	rgb_sort(d,strlen(d));
	cout<<"4:"<<d<<endl;
	rgb_sort(e,strlen(e));
	cout<<"5:"<<e<<endl;
	rgb_sort(f,strlen(f));
	cout<<"6:"<<f<<endl;
	rgb_sort(g,strlen(g));
	cout<<"7:"<<g<<endl;

	return 0;
}

void rgb_sort(char *array,unsigned int n)
{
	int cur_left,cur_right;
	int index_i,index_j;
	
	cur_left = index_i = 0;
	cur_right = index_j = n-1;

	while(cur_left <= cur_right)//条件<=
	{
		while(cur_left <= cur_right && array[cur_left] == 'R')
		{
			cur_left++;
			array[index_i] = 'R';
			index_i ++ ;
		}
		while(cur_left <= cur_right && array[cur_right] == 'B')
		{
			cur_right--;
			array[index_j] = 'B';
			index_j--;
		}
		//以上考虑了相等指向同一个元素情况!
		if(cur_left > cur_right )break;
/* 不能用额外的空间
		char temp_left = array[cur_left] ;
		char temp_right = array[cur_right];//防止下面覆盖修改!
	 
		if(temp_left == 'B')
		{
			array[index_j] = 'B';
			index_j--;
		}
		if(temp_right == 'R')
		{
			array[index_i] = 'R';
			index_i ++ ;
		}
*/	
		if(array[cur_left] == 'B'&&array[cur_right] == 'R')
		{
			array[index_j] = 'B';
			index_j--;
			array[index_i] = 'R';
			index_i ++ ;

		}
		else if(array[cur_left] == 'B')//BG
		{
			array[index_j] = 'B';
			index_j--;
		}
		else if(array[cur_right] == 'R')//RG
		{
			array[index_i] = 'R';
			index_i ++ ;
		}
			
		cur_left++;
		cur_right--;
	}
	
	while(index_i <= index_j)
	{
		array[index_i] = 'G';
		index_i++;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值