【问题标题】:Sorting a 2 Dim array in C在 C 中对 2 Dim 数组进行排序
【发布时间】:2018-11-19 12:30:52
【问题描述】:

我想根据每行第一个元素的值对二维数组进行排序。因此,在数组的第一个位置具有最低值的行应该放在数组的开头。

我在下面使用的代码:

int Array[5][4] = {
{8  ,1  ,1  ,0},
{6  ,0  ,0  ,0},    
{7  ,1  ,1  ,1},
{2  ,1  ,1  ,1},
{1  ,1  ,1  ,1} };

void sortArray(int Sort[][4])  
{   
 int k=0,x,temp;
    for(int i=0;i<5;i++)
    {
        for(int j=i+1;j<5;j++)
        {
            if(Sort[i][k] > Sort[j][k])
            {
                for(int x=0;x<2;x++) 
                {
                    temp=Sort[i][x];
                    Sort[i][x]=Sort[j][x];
                    Sort[j][x]=temp;
                }
            }
        }
    }


 for(int i=0;i<5;i++)
 {
    for(int j=0;j<4;j++)
        printf("%d ", Sort[i][j]);
        printf("\n");
 }
}

我想要的输出:

1  ,1  ,1  ,1
2  ,1  ,1  ,1
6  ,0  ,0  ,0
7  ,1  ,1  ,1
8  ,1  ,1  ,0

有什么想法吗?

【问题讨论】:

  • 您需要选择是需要 C 解决方案(例如 qsort)还是 C++ 解决方案(例如 std::sort)。你的标题说 C,你的标签说 C++。是哪个?
  • 如果您在 C 或 C++ 中搜索解决方案,请澄清。标题表示 C,但标签表示 C++。选择了一个。您还可以提供当前输出吗?顺便说一句,您的数组似乎已经按初始化排序了,对吧?
  • 嗯,从问题的内容来看,他似乎想根据每一行的第一个元素,按照升序的顺序对二维数组进行排序。
  • @DavidC.Rankin:他说最高值应该在开头,这对我来说意味着下降。
  • 我知道他在说什么——但是再看看“我想要的输出:”

标签: c++ arrays sorting multidimensional-array


【解决方案1】:

您可以使用std::vector&lt;std::vectror&lt;int&gt;&gt; 让您的生活更简单。

std::vector<std::vector<int>> Array = { {8  ,1  ,1  ,0},
                                        {6  ,0  ,0  ,0},    
                                        {7  ,1  ,1  ,1},
                                        {2  ,1  ,1  ,1},
                                        {1  ,1  ,1  ,1} };

然后你可以使用std::sort 和 lambda 函数对它们进行排序。

std::sort(Array.begin(), Array.end(),
          [](std::vector<int> const& lhs, std::vector<int> const& rhs)
          { return lhs[0] < rhs[0] });

如果数组大小在编译时已知,也可以使用std::array

std::vector<std::array<int, 4>> Array = { {8  ,1  ,1  ,0},
                                          {6  ,0  ,0  ,0},    
                                          {7  ,1  ,1  ,1},
                                          {2  ,1  ,1  ,1},
                                          {1  ,1  ,1  ,1} };

std::array<std::array<int, 4>, 5> Array = { {8  ,1  ,1  ,0},
                                            {6  ,0  ,0  ,0},    
                                            {7  ,1  ,1  ,1},
                                            {2  ,1  ,1  ,1},
                                            {1  ,1  ,1  ,1} };

std::sort 可以用于这些数组中的任何一个。


如果您必须使用 2D 数组,它会涉及更多,因为数组无法分配。您可以创建一个指向Array 元素的指针数组,使用std::sort 对指针数组进行排序。

int Array[5][4] = {
{8  ,1  ,1  ,0},
{6  ,0  ,0  ,0},    
{7  ,1  ,1  ,1},
{2  ,1  ,1  ,1},
{1  ,1  ,1  ,1} };

int* ptrArray[5] = {Array[0], Array[1]. Array[2], Array[3], Array[4]);
std::sort(ptrArray, ptrArray+5, 
          [](int* lhs, int* rhs)
          { return lhs[0] < rhs[0] });

之后可以使用ptrArray 访问排序后的数组,即使Array 仍保持其原始状态。

【讨论】:

  • OP 要求 C 语言的解决方案。您的答案是 C++。
  • @sebrockm,它被标记为 C++。
  • 对不起,你是对的。 OP,您能否通过更改标签或标题来澄清一下?
  • 嵌套std::vector这么小的结构?我宁愿建议std::vector&lt;std::array&lt;int,4&gt;&gt; 甚至std::array&lt;std::array&lt;int,4&gt;,5&gt;
  • @PeterT,这些也是可能的。这取决于数组的大小在编译时是否已知。
【解决方案2】:

你的问题在这里:

for(int x=0;x<2;x++) 

您只是交换每行的前两个元素,而不是全部四个。以下更改应使其按预期工作:

for(int x=0;x<4;x++) 

【讨论】:

  • 有效,谢谢!所以交换是基于列数
  • 你正在交换,所以你必须交换每一行中的所有元素。
猜你喜欢
  • 2011-04-23
  • 2013-12-24
  • 2013-08-05
  • 2020-04-01
  • 2021-11-18
  • 1970-01-01
  • 2018-04-20
  • 2012-04-25
相关资源
最近更新 更多