Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 三种球的排序算法_Algorithm_Sorting - Fatal编程技术网

Algorithm 三种球的排序算法

Algorithm 三种球的排序算法,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”

我们有三种不同类型的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”、“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--;
                    }
                }


            }