c ++ sort:具有相同数组值的排名列表

时间:2014-11-10 21:49:01

标签: c++ arrays sorting

我试图显示我的数组qt的排名列表,其中包含5个数字。

int i, j;
int qt[5] = {10,20,10,50,20};
int tempqt;
for (i=0; i<5; i++)
{
    for(j=(i+1); j<5; j++)
    {
        if (qt[i] >= qt[j])
        {
            tempqt = qt[i];
            qt[i] = qt[j];
            qt[j] = tempqt;
        }
    }
}

for(i=0; i<5; i++)
{
    cout << i+1 << ".number: " << qt[i] << endl;
}
通常,2个for循环对我的数组进行排序,最后一个for循环显示我的数组有序,所以它看起来像这样:

  • 1.number:10
  • 2.number:10
  • 3.number:20
  • 4.number:20
  • 5.number:50

但是我希望显示与相同排名位置具有相同值的数字,所以像这样:

  • 1.number:10
  • 1.number:10
  • 2.number:20
  • 2.number:20
  • 3.number:50

3 个答案:

答案 0 :(得分:2)

当在rank数组中遇到不同的值时,想法是增加qt计数器。

i = 0;
int rank = 1, val = qt[i];
cout << rank << ".number: " << qt[i] << endl;

for(i=1; i<5; i++)
{
    if (qt[i] != val) {
        ++rank;
        val = qt[i];
    }
    cout << rank << ".number: " << qt[i] << endl;
}

答案 1 :(得分:2)

使用std::sort对数组进行排序 - 在数组排序之前,您无法获得任何位置。

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
   int qt[5] = { 10, 20, 10, 50, 20 };
   sort(qt, qt + 5);
   int count = 1;
   for (int i = 0; i < 5; ++i)
   {
       if (i > 0)
       {
          if (qt[i] != qt[i - 1])
             ++count;
       }
       cout << count << ".number: " << qt[i] << endl;
    }
}

这是使用地图的另一种解决方案。这更像是懒惰&#34;因为没有真正的&#34;检查数字是否已经看过&#34;涉及的逻辑。只需在地图中添加数字,然后在循环中打印出结果。

如果没有内存限制(当然你需要创建数字的映射),和/或你需要数组保持稳定(没有排序),那么这可能是另一种选择。

#include <map>
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int qt[5] = { 10, 20, 10, 50, 20 };
    std::map<int, int> IntMap;

    // add entries to map, adding to a counter each time
    for (int i = 0; i < 5; ++i)
       IntMap[qt[i]]++;

    // output the results.
    int count = 1;
    for (auto it = IntMap.begin(); it != IntMap.end(); ++it, ++count)
    {
        for (int i = 0; i < it->second; ++i)
            cout << count << ".number: " << it->first << endl;
    }
}

地图已经排序,因此需要处理。然后设置地图以计算每个数字显示的次数,以便进行处理。剩下的唯一事情是编写一个循环,只是通过地图并打印信息。

请在此处查看:http://ideone.com/q08SeX

答案 2 :(得分:1)

我宁愿使用do while循环:

int p = 1, x = 0;
do 
{
    cout << p << ".number: " << qt[x++] << endl;
    if (x < 5 && qt[x] != qt[x-1])
        p++;
} while (x < 5);