Open In App

Sorting 2D Vector in C++

Last Updated : 19 Nov, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

Sorting is the process of arranging the elements of container in ascending order, descending order or in any user defined order. In this article, we will learn different ways in which a 2D vector can be sorted in C++.

By Rows

A 2D vector can be sorted by sorting each row in any desired order using sort() function on each individual row.

C++
#include <bits/stdc++.h>
using namespace std;

void sort(vector<vector<int>> &v) {

    // Sort every row one by one
    for (auto &i : v)
        sort(i.begin(), i.end());
}

int main() {
    vector<vector<int>> v = {{3, 5, 3},
                             {1, 3, 2},
                             {7, 4, 8}};
    sort(v);
  
  	for (auto i : v) {
        for (auto j : i)
            cout << j << " ";
        cout << endl;
    }
    return 0;
}

Output
3 3 5 
1 2 3 
4 7 8 

By Columns

A 2D vector can be sorted by sorting each column one by one in any desired order but sort() cannot be directly applied in this case instead, first transpose the 2D vector, sort each row (which represents the original columns) using the desired order and then transpose the 2D vector back to its original orientation.

C++
#include <bits/stdc++.h>
using namespace std;

void sort(vector<vector<int>> &v){
     int n = v.size(), m = v[0].size();
    
    // Creating new vector
    vector<vector<int>> v1(m, vector<int>(n));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            v1[j][i] = v[i][j];
    }

    // Sort every row
    for (auto &i : v1)
        sort(i.begin(), i.end());
  
  	// Copy back the sorted vector
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            v[i][j] = v1[j][i];
    }
}

int main() {
    vector<vector<int>> v = {{3, 5, 3},
                             {1, 3, 2},
                             {7, 4, 8}};
    sort(v);
  
  	for (auto i : v) {
        for (int j : i)
            cout << j << " ";
        cout << endl;
    }
    return 0;
}

Output
1 3 2 
3 4 3 
7 5 8 

By Rows and Columns

This method combines the above two methods of sorting by rows and sorting by columns by first, sorting the 2D vector row-wise, and then column-wise to desired order.

C++
#include <bits/stdc++.h>
using namespace std;

void sort(vector<vector<int>> &v){
    int n = v.size(), m = v[0].size();
    vector<vector<int>> vt(m, vector<int>(n));

    // First sort every rows of original vector
    for (auto &i : v)
        sort(i.begin(), i.end());
  
	// Create transpose vector
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            vt[j][i] = v[i][j];
    }

    // Sort every rows of new vector (original columns
    for (auto &i : vt)
        sort(i.begin(), i.end());
  
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            v[i][j] = vt[j][i];
    }
    
    return;
}

int main() {
    vector<vector<int>> v = {{3, 5, 3},
                             {1, 3, 2},
                             {7, 4, 8}};
    sort(v);
  
  	for (auto i : v) {
        for (int j : i)
            cout << j << " ";
        cout << endl;
    }
  
    return 0;
}

Output
1 2 3 
3 3 5 
4 7 8 

All Elements as a Whole

In this method of sorting, the whole vector is first flattened and then sorted so that all the elements of 2D vector should be in desired order from top to bottom zig-zag manner.

C++
#include <bits/stdc++.h>
using namespace std;

void sort(vector<vector<int>> &v) {
    vector<int> v1;

    // Copy all elements to 1D vector
    for (auto i : v) {
        for (int j : i)
            v1.push_back(j);
    }

    // Sort 1D vector
    sort(v1.begin(), v1.end());

    // Copy back the elements
    int k = 0;
    for (auto &i : v) {
        for (int &j : i)
            j = v1[k++];
    }
}

int main() {
    vector<vector<int>> v = {{3, 5, 3}, {1, 3, 2},
                             {7, 4, 8}};
    sort(v);

    for (auto i : v) {
        for (int j : i)
            cout << j << " ";
        cout << endl;
    }

    return 0;
}

Output
1 2 3 
3 3 4 
5 7 8 


Next Article
Practice Tags :

Similar Reads