【发布时间】:2018-08-18 01:47:50
【问题描述】:
我正在尝试创建这个 c++ 程序来执行下面的描述。我很确定问题出在递归中,但不确定如何解决它。我猜它只是不断迭代到无穷大和崩溃。我什至没有得到输出。我想我可以只比较前一个指针和当前指针,然后根据词典进行 3 件式临时交换。我会使用一个指针来遍历数组并在每次交换后递减它,然后以该 ptr 作为参数递归调用。没用,我在这里,请帮助我:)。如果有一个更简单的解决方案也可以,但更愿意了解我的代码哪里出错了。
#include <string>
#include <iostream>
using namespace std;
// Given an array of strictly the characters 'R', 'G', and
// 'B', segregate the values of the array so that all the
// Rs come first, the Gs come second, and the Bs come last.
// You can only swap elements of the array.
char* RGBorder(char* c_a)
{
size_t sz = sizeof(c_a)/sizeof(*c_a);
char* ptr_ca = c_a;
char* prv_ptr = ptr_ca;
ptr_ca++;
char temp;
while(*ptr_ca)
{
switch(*ptr_ca)
{
case 'R' :
if( *prv_ptr < *ptr_ca ) {
temp = *prv_ptr; *prv_ptr = *ptr_ca; *ptr_ca = temp;
} else if( *prv_ptr == *ptr_ca ) {
continue;
} else { ptr_ca--; RGBorder(ptr_ca); }
case 'G' :
if( *prv_ptr < *ptr_ca ) {
temp = *prv_ptr; *prv_ptr = *ptr_ca; *ptr_ca = temp;
} else if( *prv_ptr == *ptr_ca ) {
continue;
} else { ptr_ca--; RGBorder(ptr_ca); }
default:
ptr_ca++;
continue;
}
ptr_ca++;
cout << *ptr_ca;
}
return c_a;
}
int main()
{
char ca[] = {'G', 'B', 'R', 'R', 'B', 'R', 'G'};
char *oca =RGBorder(ca);
char *pca = oca;
while(*pca)
{
cout << *pca << endl;
pca++;
}
}
【问题讨论】:
-
size_t sz = sizeof(c_a)/sizeof(*c_a);-- 这并不像您认为的那样。顺便说一句,您的问题更广为人知的是Dutch National Flag 问题。 -
如果有更简单的解决方案也可以使用, 'G' 总是在排序列表的中间某处。这个想法是将'R'移动/交换到'G'的前面和G之后的
B's。网络上的大量示例展示了如何通过简单的线性搜索/交换来做到这一点.
标签: c++ arrays compare-and-swap