在C中对2 Dim数组进行排序

时间:2018-06-09 19:19:00

标签: c++ arrays sorting multidimensional-array

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

我在下面使用的代码:

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

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用std::vector<std::vectror<int>>来简化您的生活。

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访问已排序的数组。

答案 1 :(得分:0)

你的问题在于:

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

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

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