2013-10-08 6 views
1

Можно ли отсортировать 2D-массив с помощью qsort или std :: sort в C++, чтобы элементы находились в возрастающем порядке, когда читаете слева направо в каждой строке или сверху вниз в каждом столбце?Сортировка 2D-массива C++

Например,

13, 14, 15, 16 
1, 4, 3, 2 
7, 5, 7, 6 
9, 10, 11, 12 

становится:

{ 1, 2, 3, 4 } 
{ 5, 6, 7, 8 } 
{ 9, 10, 11, 12 } 
{ 13, 14, 15, 16 } 

Я знаю, что вы можете сделать это путем создания двух функций сравнения, а затем первая сортировка каждой строки затем сравнивая первые элементы каждой строки, чтобы установить столбцы, но есть ли способ сделать это в одной функции?

+1

Если это матрица NxN, а затем скопировать элементы вектора. Сортируйте вектор, а затем скопируйте каждую строку обратно в массив из вектора. – Mahesh

+0

Разве это не сортирует строки? Как насчет столбцов? – 1110101001

+0

Скопируйте его в вектор, отсортируйте его как массив 1D (который он сейчас), а затем скопируйте обратно в 2D-массив. –

ответ

2

Да. Библиотека C++ STL построена с разделением алгоритмов и контейнеров. Их объединяет итераторы. Raw указатель итератор, поэтому можно инициализировать вектор с помощью raw указателей, а затем сортировать этот вектор как обычно.

std::vector<int> v(arr2d, arr2d + N); // create a vector based on pointers 
             // This assumes array is contiguous range 
             // in memory, N=number of elemnts in arr2d 
// using default comparison (operator <): 
std::sort (v.begin(), v.end()); 

// cout by 4 elements in a row 
0

Теоретически вы должны иметь возможность вводить 16 чисел в массив. Для сортировки чисел используйте цикл for, возможно, даже вложенный. Затем, что касается вывода, вы хотите увеличить числа в четырех группах по четыре?

cout<<Vector[0]<<Vector[1]<<Vector[2]<<Vector[3]<<endl; 
cout<<Vector[4]<<Vector[5]<<Vector[6]<<Vector[7]<<endl; 
cout<<Vector[8]<<Vector[9]<<Vector[10]<<Vector[11]<<endl; 
cout<<Vector[12]<<Vector[13]<<Vector[14]<<Vector[15]<<endl; 

очень произвольный, но я не совсем уверен в вопросе.

-1

** Сортировка 2D массив в C++ **

#include <iostream> 

using namespace std; 

int main() 
{ 
    int i,j,k,m,temp,n,limit; 
    int** p; 


    cout<<"Enter the limit:"; 
    cin>>limit; 

    p=new int*[limit]; 

//inputing 
    for(i=0;i<limit;i++) 
    { 
     p[i] = new int[limit]; 

     for(j=0;j<limit;j++) 
     { 
      cin>>p[i][j]; 
     } 

    } 

//sorting 
    for(i=0;i<limit;i++) 
    { 
     for(j=0;j<limit;j++) 
     { 
      if (j==limit-1 && i<limit-1) 
      { 
       n =-1; 
       m=i+1; 
      } 
      else 
      { 
       m=i; 
       n=j; 
      } 

      for(k=n+1;k<limit;k++) 
      { 
       if(p[i][j] > p[m][k]) 
       { 
        temp = p[i][j]; 
        p[i][j] = p[m][k]; 
        p[m][k] = temp; 
       } 

       if(k==limit-1 && m<limit-1) { m++; k=-1; } 

      } 
     } 
    } 

    //displaying 
    for(i=0;i<limit;i++) 
    { 
     for(j=0;j<limit;j++) 
     { 
      cout<<p[i][j]<<endl; 
     } 

    } 

    return 0; 
} 
2
# include <iostream> 
using namespace std ; 


void swap (int &x , int &y) 
{ 
    int temp = x ; 
    x = y ; 
    y = temp ; 
} 

void main() 
{ 
    int arr [3][3] = {{90,80,70},{60,50,40},{30,100,10}} ; 
    int x ; 

    for (int k = 0; k < 3; k++) 
    { 
     for (int m = 0; m < 3; m++) 
     { 
      x = m+1; 
      for (int i = k; i < 3 ; i++) 
      { 
       for (int j = x; j < 3; j++) 
       { 
        if (arr [k][m] > arr [i][j]) 
         swap(arr [k][m] ,arr [i][j]); 
       } 
       x=0; 
      } 
     } 
    } 

    for (int i = 0; i < 3; i++) 
    { 
     for (int j = 0; j < 3; j++) 
     { 
      cout << arr [i][j] << " "; 
     } 
    } 


    system("pause"); 
} 

C++ Сортировка 2D массива по возрастанию

+0

Ответчик запросил ответ «используя qsort или std :: sort» – LogicG8

0

Первый Сделать 2D вектор.

Сортировать каждый вектор в этом 2D вектор

Сортировать весь вектор

Код:

#include <iostream> 
#include <vector> 
#include <algorithm> 

template <class T> 
void Sort2dArray(std::vector<std::vector<T>> & numbers) 
{ 

    for(auto & i : numbers){//sort each vector<T> in numbers 
     std::sort(i.begin(),i.end()); 
    } 
    std::sort(numbers.begin(),numbers.end(),[](//sort numbers by defining custom compare 
       const std::vector<T>& a,const std::vector<T>&b){ 
     for(int i=0;i<a.size()&&i<b.size();i++) 
     { 
      if(a[i]>b[i]) 
       return false; 
      else if(a[i]<b[i]) 
       return true; 
     } 
     return a.size()<b.size() ? true : false; 
    }); 
} 

int main() 
{ 
    std::vector<std::vector<int>> numbers={ {13, 14, 15, 16}, 
              {1, 4, 3, 2}, 
              {8, 5, 7, 6}, 
              {9, 10, 12,11}}; 
    Sort2dArray(numbers);//sort array 

    //write sorted array 
    for(auto i:numbers) 
    { 
     for(auto j:i) 
      std::cout<<j<<" "; 
     std::cout<<"\n"; 
    } 
} 
Смежные вопросы