Сортировка 2 Dim массива в C - PullRequest
0 голосов
/ 09 июня 2018

Я хочу отсортировать 2-мерный массив на основе значения первого элемента в строке.Итак, строка, которая в первой позиции массива имеет наименьшее значение, должна быть помещена в начало массива.

Код, который я использую ниже:

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 голосов
/ 09 июня 2018

Ваша проблема заключается здесь:

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

Вы меняете только первые два элемента каждого ряда, а не все четыре.Следующее изменение должно заставить его работать как задумано:

for(int x=0;x<4;x++) 
0 голосов
/ 09 июня 2018

Вы можете сделать свою жизнь проще, используя 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 и лямбда-функции для их сортировки.

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 все еще остается в своем первоначальном состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...