【问题标题】:Faster way to sort an array of structs c++对结构数组进行排序的更快方法c ++
【发布时间】:2015-01-28 23:48:36
【问题描述】:

我有一个名为 count 的结构声明为 count ,其中包含两个内容,一个称为频率的 int 和一个称为 word 的字符串。为简化起见,我的程序将一本书作为文本文件接收,并计算每个单词出现的次数。我有一个结构数组,我有我的程序,每次出现一个单词时它都会计数,现在我想要一种更快的方法来按最高频率对数组进行排序,而不是下面的方法。我使用了下面的冒泡排序算法,但是使用这种方法运行我的代码太长了。欢迎任何其他建议或帮助!我从算法库中查找了排序,但不明白我将如何在这里使用它。我是 C++ 新手,所以很多关于如何使用排序的解释会有很大帮助。

void sortArray(struct count array[],int size)
{
    int cur_pos = 0;
    string the_word;
    bool flag= true;

    for(int i=0; i<(size); i++)
    {
        flag = false;
        for(int j=0; j< (size); j++)
        {
            if((array[j+1].frequency)>(array[j].frequency))
            {
                cur_pos = array[j].frequency;
                the_word = array[j].word;
                array[j].frequency = array[j+1].frequency;
                array[j].word = array[j+1].word;
                array[j+1].frequency = cur_pos;
                array[j+1].word = the_word;
                flag = true;
            }
        }
    }
};

【问题讨论】:

  • 为什么不使用std::map 问题解决了。
  • 或者只是一个更好的算法......
  • std::sort(array, array+size, [](count const &amp;a, count const &amp;b){ return a.frequency &lt; b.frequency; });
  • ^你能再解释一下吗?我知道它正在将数组从开头排序为数组+大小,但我不明白之后的部分。
  • 一旦你弄清楚如何使用std::sort、函子、lambda、运算符重载等。你也可以看到this

标签: c++ arrays sorting struct


【解决方案1】:

你只需要为你的结构定义 operator less, 并使用 std::sort,参见示例:

http://en.wikipedia.org/wiki/Sort_%28C%2B%2B%29

【讨论】:

    【解决方案2】:

    为数据集创建一对后,您可以使用 std::map 作为容器并将对插入其中。如果要按频率排序,请定义 std:map 如下

    std::map myMap; myMap.insert(std::make_pair(frequency,word));

    std::map 在内部使用二叉树,所以当你检索它时你会得到一个排序的数据。

    【讨论】:

    • 如果两个词频率相同怎么办?
    • 如果他们知道如何使用std::map,他们也会知道如何使用std::sort