从两侧同时对数组进行排序

时间:2016-08-07 18:47:19

标签: c++ arrays sorting

我的一个练习是10个字符串,我必须排序 事实上,数组是随机顺序,每个元素都有一个表示球的字符(G =绿色,R =红色,B =蓝色)。

我必须对这个数组进行排序,这样所有的R球都会到达数组的开头,G到结尾,蓝色在中间。
此外,我必须以低时间复杂度和内存复杂性来做到这一点。 我试过这个,但我成功的只是把红球放在阵列的乞讨中。

这是我的代码:

char arr[10] = {
    'R', 'G', 'B',
    'G', 'G', 'R',
    'B', 'R', 'G',
    'B'
};

for (int i = 0, j = 10; i < 10-1, j > i; i++, j--)
{
    for (int k = 0; k < 10; k++)
    {
        if (arr[k] == 'R')
        {
            char temp = arr[i];
            arr[i] = arr[k];
            arr[k] = temp;
        }
        if (arr[k] == 'G')
        {
            char temp2 = arr[j];
            arr[j] = arr[k];
            arr[k] = arr[j];
        }
    }
}

3 个答案:

答案 0 :(得分:2)

由于数组中元素的域非常有限,您可以使用counting sort的简化形式轻松解决此问题。

  1. 创建三个计数器,分别为红色,绿色和蓝色,每个计数器初始化为0。
  2. 计算三者中每一个的出现次数。
  3. 覆盖数组 - 首先用红色表示你找到的数字,然后是蓝色,然后是绿色。

答案 1 :(得分:1)

您只有三种颜色,因此您的阵列中会有重复。在这种情况下,使用这些比使用原始位置更容易。只计算有多少红色,蓝色和绿色,然后将其中的许多都写入阵列。

答案 2 :(得分:0)

编辑后应该可以正常使用

    for (int i = 0, j = 9; i < 10-1, j > 1; i++, j--)