对obj数组进行排序和分组

时间:2013-11-06 14:09:59

标签: c++

想象一下这是一个对象数组。对象由类型和分数组成。  假设我需要相应地对它们进行排序,要么键入a或b,给出优先级,然后按照desc顺序从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 while,while)。我唯一想到的是通过将一个组合在一起对数组进行排序,然后在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; 
         }
     }
 }

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

1 个答案:

答案 0 :(得分: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;
}

您可以将此与STL中的std::sort算法一起使用:

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

与C风格的数组一样。

如果你不被允许使用std::sort(如在一些家庭作业中)那么你可以实现任何排序算法(bubblesort,quicksort等),并简单地比较两个object与运算符&lt;

// 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]);
   }
}