如何在维护主要排序的同时执行辅助排序

时间:2015-04-03 00:05:10

标签: c++ sorting selection

例如,我正在编写带有条目的哈希表(字符串键,int计数)。首先,我正在进行选择排序,按计数对每个条目进行排序。然后我想按字母顺序对它们进行排序,同时保持排序的计数。有没有办法做到这一点?

这是主要的排序。

void MyTrends::sortByCount(Entry* arr, int sizeOfArray) {
  int maxIndex; // the index of the element that has the highest count
  for(int i=0; i < sizeOfArray-1; i++){
      maxIndex = i;
      for(int j=i+1; j < m; j++){
          if(arr[j].getCount() > arr[maxIndex].getCount()){ //if the count of element j is higher than the count of the Entry at the current max index then change the max index to j
              maxIndex = j;
          }
      }
      if (maxIndex != i) {
          Entry temp = arr[i]; //next 2 lines + this line are swapping max to first position and old first position to the position the max was in
          arr[i] = arr[maxIndex];
          arr[maxIndex] = temp;
      }
  }
}

编辑:在考虑了一些之后,可以通过首先按字母顺序排序然后使用稳定排序按计数排序来完成吗?

2 个答案:

答案 0 :(得分:5)

您需要的是自定义Entry比较运算符。 E.g。

struct Entry {
    int num;
    char letter;
}

bool operator< (const Entry& lhs, const Entry& rhs)
{
    if ( lhs.num == rhs.num )
        return lhs.letter < rhs.letter;
    else
        return lhs.num < rhs.num;
}

然后使用自定义比较对其进行排序。该列表将首先按数字(num成员)排序,然后使用letter成员按字母顺序排序。

答案 1 :(得分:4)

struct Entry {
  int num;
  char letter;
  friend auto make_tie(Entry const&e){
    return std::tie(e.num,e.letter);
  }
  friend bool operator<(Entry const&lhs, Entry const& rhs){
    return make_tie(lhs)<make_tie(rhs);
  }
};

利用tuple的词法排序来命令您输入。 tie制作了一组参考文献。

它需要编写make_tie,但是一旦你有了==,你可以免费获得< swap,你也可以将它用于其他一些功能 - 序列化,打印, make_tie等等。

->decltype(std::tie(e.num,e.letter))是C ++ 14 - 对于C ++ 11,您需要在){ make_tie之间添加{{1}}。