C/C++

С++ | Надо отсортировать двухмерный массив N*M в порядке возрастания и спадания ПО КАЖДОМУ СТОЛБЦУ ОТДЕЛЬНО

Мы задаём массив arr [i] [j] путём ввода каждого элемента и он отображается сначала, в первоначальном виде, например:
71 | 49 | 84 | 92 | 51
82 | 93 | 28 | 45 | 12
40 | 55 | 71 | 60 | 88
93 | 51 | 40 | 10 | 34

А надо отсортировать его и вывести сначала вот так:
40 | 49 | 28 | 10 | 12
71 | 51 | 40 | 45 | 34
82 | 55 | 71 | 60 | 51
93 | 93 | 84 | 92 | 88

А затем наоборот, так же отдельно по каждому столбцу, но в порядке уменьшения сверху вниз:
93 | 93 | 84 | 92 | 88
82 | 55 | 71 | 60 | 51
71 | 51 | 40 | 45 | 34
40 | 49 | 28 | 10 | 12

Если кто шарит, помогите пожалуйста, только пж без всяких <algorithm>, <vector>, а вот с этого:

using namespace std;
int main()
{
const int maxn = 10;
const int maxm = 10;
int n;
int m;
int i, j, k;
int tmp;
int arr[maxn][maxm];
cout << endl;
printf(" \x1b[36m Введите количество строк: \x1b[0m");
cin >> n;
printf(" \x1b[33m Введите количество столбцов: \x1b[0m");
cin >> m;

for (i = 0; i <= n - 1; i++)
{
for (j = 0; j <= m - 1; j++)
{
cout << " Введите элемент массива arr (" << i + 1 << ", " << j + 1 << ") =\t";
cin >> arr[i][j];
}
}
cout << endl;
printf(" Начальный вид массива:\n");
for (i = 0; i <= n - 1; i++)
{
for (j = 0; j <= m - 1; j++)
cout << " " << arr[i][j];
cout << endl;
}

Ну и вот далее надо в таком же духе сортонуть и вывести в порядке возрастания и уменьшения по каждому столбцу отдельно (выше) :3
Тоже с двумерным динамическим массивом. Сортировка по возрастанию и убыванию -пузырьковая.
#include <iostream>
#include <iomanip>
#include <cstdio>
using namespace std;
void print_array(int **x, int a, int b)
{
int i, j;
for (i = 0; i < a; i++)
{
for (j = 0; j < b; j++) cout << setw(4) << x[i][j];
cout << endl;
}
cout << endl;
}
int main()
{
int n, m, i, j, k;
printf(" \x1b[36m Введите количество строк: \x1b[0m");
cin >> n;
printf(" \x1b[33m Введите количество столбцов: \x1b[0m");
cin >> m;
int **arr = new int *[n];
for (i = 0; i < n; i++) arr[i] = new int [m];
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
cout << " Введите элемент массива arr ("
<< i + 1 << ", " << j + 1 << ") =\t";
cin >> arr[i][j];
}
}
cout << endl;
printf(" Начальный вид массива:\n");
print_array(arr, n, m);
for (j = 0; j < m; j++)
for (i = 1; i < n; i++)
for (k = n - 1; k >= i; k--)
if (arr[k - 1][j] > arr[k][j])
swap(arr[k - 1][j], arr[k][j]);
printf(" Он же, отсортированный по возрастанию:\n");
print_array(arr, n, m);
for (j = 0; j < m; j++)
for (i = 1; i < n; i++)
for (k = n - 1; k >= i; k--)
if (arr[k - 1][j] < arr[k][j])
swap(arr[k - 1][j], arr[k][j]);
printf(" Он же, отсортированный по убыванию:\n");
print_array(arr, n, m);
for (i = 0; i < n; i++) delete [] arr[i];
delete arr;
}
Ещё осуществлять ввод элементов в таком виде достаточно хлопотно. А сортировку можно сделать и один раз, что вполне достаточно, после чего элементы каждого столбца можно просто реверсировать, а не сортировать по убыванию, но у меня на всякий случай массив сортируется дважды.
Alexey Dyomin
Alexey Dyomin
66 572
Лучший ответ
#include "iostream"
using namespace std;
int main(){
int n,m; cout<<"Enter the sizes of array: "; cin>>n>>m;
int **a=new int*[n]; for(int i=0;i< n;i++)a[i]=new int[m];
for(int i=0;i< n;i++){cout<<"Enter "<< m<<" elements of line "<< i+1<<": ";
for(int j=0;j< m;j++)cin>>a[i][j];} cout<<'\n';
for(int i=0;i< n;i++){for(int j=0;j< m;j++)cout<<a[i][j]<<'\t'; cout<<'\n';} cout<<'\n';
for(int k=1;k< n;k++)for(int i=1;i< n;i++)for(int j=0;j< m;j++)
if(a[i][j]< a[i-1][j]){int t=a[i-1][j];a[i-1][j]=a[i][j];a[i][j]=t;}
for(int i=0;i< n;i++){for(int j=0;j< m;j++)cout<<a[i][j]<<'\t'; cout<<'\n';} cout<<'\n';
for(int i=0;i< n/2;i++)for(int j=0;j< m;j++){int t=a[i][j];a[i][j]=a[n-i-1][j];a[n-i-1][j]=t;}
for(int i=0;i< n;i++){for(int j=0;j< m;j++)cout<<a[i][j]<<'\t'; cout<<'\n';} cout<<'\n';
for(int i=0;i< n;i++)delete []a[i]; delete []a;}
Отлично задачу вы себе дали решайте
HM
Hursand Matnazarov
3 500
Данил Мартынов и к чему ты это высрал?

Похожие вопросы