Algorithm 三种球的排序算法
我们有三种不同类型的N个球:红色(r)、蓝色(b)和白色(w) 我需要对它们进行分类,让红色的球先出现,然后是白色的球,最后是蓝色的球 例如: In:BWRBRWWRBAlgorithm 三种球的排序算法,algorithm,sorting,Algorithm,Sorting,我们有三种不同类型的N个球:红色(r)、蓝色(b)和白色(w) 我需要对它们进行分类,让红色的球先出现,然后是白色的球,最后是蓝色的球 例如: In:BWRBRWWRB string[] arrBalls = { "b", "w", "r", "w", "r", "b", "b", "r", "w", "w", "r", "b" }; 输出:rrrrwwwbbbb 我需要找到一个线性O(n)算法 更新:C#代码 string[]arrbolls={“b”、“w”、“r”、“w”、“r”、“b”
string[] arrBalls = { "b", "w", "r", "w", "r", "b", "b", "r", "w", "w", "r", "b" };
输出:rrrrwwwbbbb
我需要找到一个线性O(n)算法
更新:C#代码
string[]arrbolls={“b”、“w”、“r”、“w”、“r”、“b”、“b”、“r”、“w”、“w”、“r”、“b”};
int index_red=0;
int index_blue=arrbolls.Length-1;
for(int i=0;i
将三种球中的每一种球计算为3个变量。假设你数了红色的球、B
蓝色的球和W
白色的球。然后你输出R“R”
,然后是W“W”
,然后是B“B”
,你的意思是要计算所有类型+构建新的arr=O(2n),用O(1n)无法做到这一点?只检查一次arr?我检查一次数组。然后我只使用3个计数器。同样O(2n)=O(n)
。当使用O乘法常数不重要。是的,我知道O(2n)+O(5n)=O(n),我只是想把所有红色的球移到起点,蓝色的球移到终点,而不是所有白色的球都留在中间,代码见更新,但你的方法更好吗?为了完整性,在维基百科关于Bucket排序的文章中,这种方法被称为Postman排序。邮递员的排序似乎适合于最重要的数字[属性]第一个基数排序。您可以添加一个标记,指定您使用的语言吗?请遵守格式约定,不要浪费垂直空间,至少在StackExchange帖子中是这样。(根据语言(你不命名),字符串比较使用<代码> ==<代码>可能或不可能得到期望的结果。这是C代码,但我正在寻找最好的算法O(1n),我不在乎使用C++、C、JavaCrIt语言。这就是为什么我没有标记任何语言。
string[] arrBalls = { "b", "w", "r", "w", "r", "b", "b", "r", "w", "w", "r", "b" };
int index_red = 0;
int index_blue = arrBalls.Length - 1;
for (int i = 0; i < arrBalls.Length; i++)
{
if (arrBalls[i] == "r" && index_red != i)
{
string TempRed = arrBalls[index_red];
arrBalls[index_red] = arrBalls[i];
arrBalls[i] = TempRed;
if (arrBalls[index_red] == "r")
{
while(arrBalls[index_red] == "r")index_red++;
}
else
{
index_red++;
}
}
if (arrBalls[i] == "b" && index_blue != i)
{
string TempRed = arrBalls[index_blue];
arrBalls[index_blue] = arrBalls[i];
arrBalls[i] = TempRed;
if (arrBalls[index_blue] == "b")
{
while (arrBalls[index_blue] == "b") index_blue--;
}
else
{
index_blue--;
}
}
}