在 C++ 中对多维数组进行排序

n32*_*303 3 c++ arrays sorting

我是编程初学者,我有一个问题。我必须创建二维数组 [5][3] ...让我们说这是其中一部分的示例:

  1. 2 3 4
  2. 7 8 9
  3. 5 6 7

然后我必须得到行的总和并将其写在此旁边:

  1. 2 3 4 9
  2. 7 8 9 24
  3. 5 6 7 18

现在,我必须按此总和对数组进行排序,因此结果如下所示:

  1. 7 8 9 24
  2. 5 6 7 18
  3. 2 3 4 9

我不知道如何实现这一点,这是我的代码:

    #include <iostream>
    #include <time.h>
    using namespace std;


    void tocke(int polje[5][3])
    {
      int vsota;
       srand(time(NULL));
       int sums[5];
for (int i = 0; i < 5; i++)
{
    vsota = 0;
    cout << endl;
    cout << i + 1 << ". ";

    for (int j = 0; j < 3; j++){
        polje[i][j] = (rand() % 10 + 1);
        vsota += polje[i][j];
        sums[i] = vsota;
        cout << polje[i][j] << "  ";
    }
}   
    }

    void urejaj(int polje[5][3])
    {
cout << "\n\n\n\n" << endl;
int sums[5];
int vsota ;
double temp;




for (int i = 0; i < 5; i++)
{
    vsota = 0;
    cout << endl;
    cout << i + 1 << ". ";
    for (int j = 0; j < 3; j++)
    {

        vsota += polje[i][j];
        sums[i] = vsota;

        if (sums[i] < sums[i+1])
        {

            temp = polje[i][j];
            polje[i][j] = polje[i + 1][j];
            polje[i + 1][j] = temp;

        }

        cout << polje[i][j] << " ";

    }cout << sums[i];

    }

    }











   int main()
    {
int polje[5][3];
tocke(polje);
urejaj(polje);
cout << "\n";
system("pause");
return 0;


   }
Run Code Online (Sandbox Code Playgroud)

第一个函数在字段中写入元素,第二个函数必须对字段进行排序。

Tho*_*ews 5

通过更改数据结构,您的问题可能更容易解决。有一个结构数组,而不是一个数组数组。该结构将包含总和和值数组。

struct Row
{
  int sum;
  std::vector<int> values;
};

Row data[5];
Run Code Online (Sandbox Code Playgroud)

有了这个概念,您就可以按总和对行进行排序。
您可以轻松地为此编写一个比较器并使用std::sort

bool Compare_Rows(const Row& a, const Row &b)
{
  return a.sum < b.sum;
}

//...
std::sort(&data[0], &data[5], Compare_Rows);
Run Code Online (Sandbox Code Playgroud)

编辑 1 - 重载运算符 <
您可以通过提供重载运算符来简化并且不需要比较器<

struct Row
{
  int sum;
  std::vector<int> values;

  bool operator<(const Row& other)
  {
    return sum < other.sum;
  }
};
Run Code Online (Sandbox Code Playgroud)

排序调用现在变为:

std::sort(&data[0], &data[5]);
Run Code Online (Sandbox Code Playgroud)

  • 改为在内置数组上使用非成员 `begin` 和 `end`。使用 `std::sort(std::begin(data), std::end(data))`,参数变得更通用,并且可以在稍后阶段更改容器而无需更改此代码。 (2认同)