0

把它想象成一个对象数组。对象由类型和分数组成。假设我需要相应地对它们进行排序,输入 a 或 b,给出优先级,然后按降序排列从 0 -100 的分数。

 [0]   [1]   [2]   [3]    [4]     [5]    [6]
----------------------------------------------
|a   | b   | a   |   a |    b  |    b  |  a  |
|50  | 90  | 30  |   80|    20 |   30  |  60 |
----------------------------------------------

排序后会是这个样子。

[0]   [1]   [2]   [3]    [4]     [5]    [6]
----------------------------------------------
| a  | a   | a   |   a |   b   |    b  |  b  |
| 80 | 60  | 50  | 30  |  90   |  30   | 20  |
----------------------------------------------

只允许使用 if else 语句,循环例如(for,do while,while),代码量最少。我唯一想到的是通过将 a 组合在一起对数组进行排序,然后按 desc 排序。使用嵌套 for 循环和 if else 语句

char first, second;

for (int i = 0; i < count; i++)
{ 
  first = array[i].getType();
  for (int j = 0; j < count; j++)
    {
        second = array[j].getType();
        if ((first.compare('a') == 0) && (second.compare('a') != 0) ||
              (first.compare('a') != 0)  && (second.compare('a') == 0))
        {
             Obj temp = array[i];
             array[i] = array[j];
     array[j] = temp; 
         }
     }
 }

然后按 desc 顺序排序。我确信那里有更好的解决方案。任何人都可以分享如何解决这个问题?

4

1 回答 1

0

我认为最简单和最干净的方法是为您的类型定义一个比较运算符。

struct object
{
  char type;
  int score;
}

bool operator<(object const& l, object const& r)
{
  return (l.type == r.type) ? l.score < r.score : r.type < l.type;
}

您可以将其与std::sortSTL 中的算法一起使用:

vector<object> objs;
std::sort(objs.begin(), objs.end());

与 C 样式数组相同。

如果不允许使用std::sort(如在某些作业中),那么您可以实现任何排序算法(冒泡排序、快速排序等),只需将两个objects 与运算符 < 进行比较。

// dummy example
for(int i = 0; i < count; ++i)
{
   for(int j = 0; j < count; ++j)
   {
      auto second = objs[j];
      if(!(objs[i] < objs[j]))
         std::swap(objs[i], objs[j]);
   }
}
于 2013-11-06T14:29:48.217 回答