Форум программистов, компьютерный форум CyberForum.ru

Сортировка двумерного массива по возрастанию - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 308, средняя оценка - 4.75
Lyric
 Аватар для Lyric
1 / 1 / 0
Регистрация: 01.02.2009
Сообщений: 4
07.02.2009, 02:36     Сортировка двумерного массива по возрастанию #1
Помогите, пожалуйста с задачей.
Необходимо отсортировать двумерный массив по возрастанию (не переводя его в одномерный).

Должно получиться примерно так:
0 0 1 1
2 3 4 5
7 8 9 9

С помощью одномерного массива - у меня получилось. А как без него не представляю даже:'(
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2217 / 732 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
07.02.2009, 02:38     Сортировка двумерного массива по возрастанию #2
C++
1
2
3
4
5
6
7
for(int i=0;i<n;i++) {
    for(int j=0;j<m;j++) {
 
 
    };
 
};
такой цикл пробегает массив в нужном порядке.
Lyric
 Аватар для Lyric
1 / 1 / 0
Регистрация: 01.02.2009
Сообщений: 4
07.02.2009, 03:02  [ТС]     Сортировка двумерного массива по возрастанию #3
XuTPbIu_MuHTAu, спасибо

Но я понимаю, как пробежать по двумерному массиву в нужном порядке. У меня проблема в том что я не могу придумать как связать это с этим алгоритмом сортировки для одномерного массива:
C++
1
2
3
4
5
6
7
8
9
10
11
12
for(int i=0; i<size-1; i++)
    {
        for(int j=size-1; j>i; j--)
        {
            if (a[j]<a[j-1])
            {
                int tmp=a[j];
                a[j]=a[j-1];
                a[j-1]=tmp;
            }
        }
    }
Если двумерный перевести в одномерный, отсортировать по этому алгоритму и потом перевести назад в двумерный - нет проблем. А как без перевода?

P.S. Извините за код. Не разобралась пока, как делать вложения
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2217 / 732 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
07.02.2009, 03:55     Сортировка двумерного массива по возрастанию #4
Цитата Сообщение от Lyric Посмотреть сообщение
XuTPbIu_MuHTAu, спасибо

Но я понимаю, как пробежать по двумерному массиву в нужном порядке. У меня проблема в том что я не могу придумать как связать это с этим алгоритмом сортировки для одномерного массива
А если тебе скажут,например,через один сортировать - тоже не поймешь,как связать? Самая простая сортировка - пузырьком - требует способа пробежать массив от начала до конца. Два раза - во вложенных циклах. Вперед!
Lyric
 Аватар для Lyric
1 / 1 / 0
Регистрация: 01.02.2009
Сообщений: 4
07.02.2009, 04:18  [ТС]     Сортировка двумерного массива по возрастанию #5
XuTPbIu_MuHTAu, я понимаю, для Вас это легко. А я начала учить программирование два месяца назад - сейчас рассматриваю задачки месячной давности и смеюсь над тем, как я над ними корпела...

Но все равно - спасибо за пинок!
Ушла думать
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2217 / 732 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
07.02.2009, 04:37     Сортировка двумерного массива по возрастанию #6
Цитата Сообщение от Lyric Посмотреть сообщение
Но все равно - спасибо за пинок!
Ушла думать
Правильный подход.После того,как отчаешься - помучайся еще полчаса, потом закрой все нафиг,уйди гулять,спать или еще что-нибудь.На следующий день открой заново и просмотри программу всю - сверху вниз,внимательно - если просто не работает.Обычно срабатывает. Если так и не будет идеи - обращайся.
Бартимеус
 Аватар для Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
07.02.2009, 12:25     Сортировка двумерного массива по возрастанию #7
Чет я тебя не пойму. Используй вложенный цикл, и внутри второго for используй пузырьковую сортировку
Lyric
 Аватар для Lyric
1 / 1 / 0
Регистрация: 01.02.2009
Сообщений: 4
07.02.2009, 15:18  [ТС]     Сортировка двумерного массива по возрастанию #8
Ой, это я кажется, неправильно объяснила условие

Цитата Сообщение от Бартимеус Посмотреть сообщение
Используй вложенный цикл, и внутри второго for используй пузырьковую сортировку
Если сделать как ты говоришь, массив отсортируется по строкам - каждая строка отдельно (или по столбцам). Это действительно просто.

А мне нужно отсортировать весь массив. Например:

3 2 9 0
7 1 0 8
5 9 4 1 массив

0 2 3 9
0 1 7 8
1 4 5 9 сортировка по строкам

0 0 1 1
2 3 4 5
7 8 9 9 сортировка всего массива
Бартимеус
 Аватар для Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
10.02.2009, 09:29     Сортировка двумерного массива по возрастанию #9
попробуй использовать условие: если елемент массива[1][3]>елемент массива[2][0] то поменять их местами
stolyars
10 / 10 / 1
Регистрация: 24.12.2008
Сообщений: 32
10.02.2009, 19:06     Сортировка двумерного массива по возрастанию #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//сортировка двухмерного массива
//по возрастанию
//массив заполняется "случайными"числами с помощью rand()
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
    setlocale(0,"");//чтоб консоль писала по русски
    srand(time(NULL));   
    const int str=5;    
    const int stolb=5;    
    int mass[str][stolb];  
    int i,j,a,c,e=1,d=100,temp,x,z;
    //заполняем двухмерный массив и выводим на экран
    //______________________________________________________________________________
    cout<<"До сортировки""\n\n";
    for(i=0;i<str;i++)   
    {                      
        for(j=0;j<stolb;j++)
         {
            a=rand()%(d-e)+e;
            mass[i][j]=a;
            cout<<mass[i][j]<<"\t";
         }
        cout<<"\n\n\n\n";
    }
    cout<<"\n\n";
    //Сортируем массив
    //_______________________________________________________________________________
    for(c=0;c<=(str*stolb);c++)//колличество проходов
    {
        //в строках упорядочиваем
        //____________________________________________
       for(i=0;i<str;i++)
         {
           for(j=0;j<stolb-1;j++)
            {
              if(mass[i][j]>mass[i][j+1])
               {
                 temp=mass[i][j];
                 mass[i][j]=mass[i][j+1];
                 mass[i][j+1]=temp;
               }
            }
         }
       //в столбах упорядочиваем
       //_____________________________________________
       for(x=0;x<stolb;x++)
         {
           for(z=0;z<str-1;z++)
            {
              if(mass[z][x]>mass[z][x+1])
               {
                 temp=mass[z][x];
                 mass[z][x]=mass[z][x+1];
                 mass[z][x+1]=temp;
               }
           }
        }
     }
    //вывод на экран после сортировки
    //__________________________________________________________
    
    cout<<"После сортировки по возрастанию""\n\n\n\n";
    for(i=0;i<str;i++)
    {
        for(j=0;j<stolb;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n\n\n\n";
    }
    system("pause");
}
не фонтан но работает.учу 2 месяца всего...так что сильно не пинать...
Olgert
Сообщений: n/a
20.03.2011, 19:32     Сортировка двумерного массива по возрастанию #11
C++
1
2
3
4
5
6
7
8
9
10
11
for (i=0;i<n;i++)
  for (j=0;j<n;j++)
 
   for (a=0;a<n;a++)
     for (b=0;b<n;b++)
       if (array[a][b]>array[i][j])
       {
         temp=array[a][b];
         array[a][b]=array[i][j];
         array[i][j]=temp;
       }
Это больше подходит заданию Lyric
iVn
Сообщений: n/a
11.05.2011, 02:06     Сортировка двумерного массива по возрастанию #12
у меня вот так всё вышло (подобное задание)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 3
 
void main (){
clrscr();
//initialize mas
int mas[MAX][MAX];
 
//get random mas
int i, j;
for (i = 0; i<MAX; i++)
    for (int j = 0; j<MAX; j++) mas[i][j] = rand() % 8;
    
//original mass
cout<<"Original: "<<endl;
for (i = 0; i<MAX; i++)
    for (int j = 0; j<MAX; j++) 
        cout<<"mas["<<i<<"]["<<j<<"] = "<<mas[i][j]<<endl;
 
//sort mas
for (i = 0; i < MAX*MAX; i++)
    {
    for (int j = (MAX*MAX)-1; j>i;j--)
        {
            if (((int *)mas)[j] < ((int *)mas)[j-1])
            {
                int temp = ((int *)mas)[j];
                ((int *)mas)[j] = ((int *)mas)[j-1];
                ((int *)mas)[j-1] = temp;
            }
        }
    }
 
//show mas
cout<<"Sorted: "<<endl;
for (i = 0; i<MAX; i++)
    for (int j = 0; j<MAX; j++)
        cout<<"mas["<<i<<"]["<<j<<"] = "<<mas[i][j]<<endl;
 
//wait
getch();
}
KoMaTo3Huk
5 / 5 / 1
Регистрация: 01.05.2012
Сообщений: 48
07.03.2013, 01:34     Сортировка двумерного массива по возрастанию #13
Как вариант, если нужно, чтоб не выводило в отдельном цикле
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stdafx.h"
#include <iostream>
#include "stdlib.h"
#include <conio.h>
#include <time.h>
#include "iomanip"
using namespace std;
//sort postro4no
int _tmain(int argc, _TCHAR* argv[])
{m1:int const n=7,m=8;
system("cls");
int A[n][m],i,j,k,c,l,a,b;
cout<<" ";
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
{A[i][j]=rand()%9+1;  //inits.
cout<<A[i][j]<<setw(2);}cout<<endl;}
cout<<endl;
 
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
{for(k=j+1;k<m;k++)
{if(A[i][j]>A[i][k])
{c=A[i][j];
A[i][j]=A[i][k];
A[i][k]=c;}}
 
for (a=i+1;a<n;a++)
{for (b=0;b<m;b++)
{if (A[i][j]>A[a][b])
{c=A[i][j];
A[i][j]=A[a][b];
A[a][b]=c;}}}
cout<<A[i][j]<<setw(2);}cout<<endl;}
 
 
 
cout<<endl<<"One more? (1-yes,0-no)";
int x;
cin>>x;
if (x==1) {goto m1;}
    return 0;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.03.2013, 01:50     Сортировка двумерного массива по возрастанию #14
Цитата Сообщение от Olgert Посмотреть сообщение
Это больше подходит заданию Lyric
Это излишне много циклов.
Цитата Сообщение от KoMaTo3Huk Посмотреть сообщение
Как вариант, если нужно, чтоб не выводило в отдельном цикле
Это много циклов + вырвиглазное оформление.

А ответ прост.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const int size=10;
int a[size][size];
 
void sort(){
    int inext, jnext;
    int i, j;
    int temp;
    bool sorted=false;
    while(!sorted){
        sorted=true;
        i=0; j=0;
        for(inext=0; inext<size; inext++)
            for(jnext=(inext?0:1); jnext<size; jnext++)
            {
                if(a[i][j]>a[inext][jnext]){
                    temp=a[i][j];
                    a[i][j]=a[inext][jnext];
                    a[inext][jnext]=temp;
                    sorted=false;
                }
                i=inext;
                j=jnext;
            }
    
    }
}
Добавлено через 8 минут
//сортировка пузырьком по аналогии с сортировкой одномерного массива
//перебираем элементы по очереди, начиная с a[0][1]
//в двойном вложенном цикле, словно выводим 2д массив
//и сравниваем в цикле элемент с предыдущим, а не со следующим
i=inext, j=jnext; //а в роли индекса предыдущего элемента выступает значение,
//запомненное в конце предыдущей итерации цикла! в этом вся моя фишка.
//Благодаря этому не нужно лишних условий на границах массива
//и мучительных попыток выбора то ли a[i+1][j] то ли a[0][j+1] на роль следующего элемента

Добавлено через 2 минуты
Сделано на основе оптимизированного варианта сортировки пузырьком одномерных массивов
http://neerc.ifmo.ru/wiki/index.php?...86.D0.B8.D1.8F
Туся111
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 43
04.05.2013, 18:23     Сортировка двумерного массива по возрастанию #15
почему выдает ошибку в сортировке?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
void main(void) // головная программа
{
setlocale (0, "Rus"); // русский язык
int a;
do
{
int count=0; // счетчик
int count1=0; 
int n; // переменая для количества строк
int m; //переменая для количества столбцов
int i; //обьяв. переменую
int j; //обьяв. переменую
cout<<"введите количество строк"<<endl;
        cin>>n;// вводим кол строк
cout<<"введите количество столбцов"<<endl;
        cin>>m;// водим количество столбцов
        int**mass=new int*[n];                  //      динамическое 
for (i=1; i<=n; i++)                    //      выделение
    mass[i]=new int[m];             //          памяти под массив
cout<<"введите элементы массива"<<endl;
 for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
          { 
                    cin>>mass[i][j];// водим массив
          }
    } 
  for (i=1; i<=n; i++)
  {    
        for (j=1; j<=m; j++)
        {         
            if (mass[i][j]==0)// если не равно 0 тогда....
             {
                count1++;//нарастили счетчик
             }
        }
      if (!count1)// если коли. нулевых элементов в массиве равно количество строк тогда
        {
          count++;// нарастили счетчик
        }
        count1=0;// обнулили счетчик
   }  
    cout<<"количество строк не содержащие нулевые эжлементы "<<count<<endl;// выводим результат
for(int k = 1; k <=m * n; k ++)
        for(int i = 1; i <=n; i ++)
            for(int j = 1; j <=m; j ++)
            {
                if((mass[i][j] > mass[i][j + 1]) && j != n - 1)
                {
                    int tmp = mass[i][j];
                    mass[i][j] = mass[i][j + 1];
                    mass[i][j + 1] = tmp;
                }
                if((mass[i + 1][0] < mass[i][j]) && (i != m - 1))
                {
                    int tmp = mass[i + 1][0];
                    mass[i + 1][0] = mass[i][j];
                   mass[i][j] = tmp;
                }
            }
            for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n\n\n\n";
            }
cout << "Повторить нажми 0" << endl; // вывод сообщения на экран
cin>> a;
}
 while(a==0);
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
04.05.2013, 19:44     Сортировка двумерного массива по возрастанию #16
потому что вопрос задать на форуме не умеешь. Какую именно ошибку? Зачем эти очевидные комментарии? Почему прогу читать невозможно из-за отсутствия тегов и отступов?
Лучше разберись в моём коде. Потому что твой ещё и в два раза больше
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
05.05.2013, 01:23     Сортировка двумерного массива по возрастанию #17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//сортировка пузырьком
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
void printMatrix(int[][12], const int);
 
using namespace std;
 
int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
 
const int SIZE = 12;
int matrix[SIZE][SIZE];
int temp;
srand(time(NULL));
 cout<<"До сортировки""\n\n";
//заполняем массив случайным образом
for(int i = 0; i < SIZE; i++)
for(int j = 0; j < SIZE; j++)
matrix[i][j] = 1 + rand() % 100;
printMatrix(matrix, SIZE);
//сортируем пузырьком
for(int N = 1; N < SIZE * SIZE; N++)
{
for(int i = 0; i < SIZE; i++)
{
for(int j = 0; j < SIZE - 1; j++)
{
if(matrix[i][j + 1] < matrix[i][j])
{
temp = matrix[i][j + 1];
matrix[i][j + 1] = matrix[i][j];
matrix[i][j] = temp;
}
}
//сравниваем последний элемент текущей строки
//с перым элементом следующей
if(matrix[i + 1][0] < matrix[i][SIZE - 1])
{
temp = matrix[i + 1][0];
matrix[i + 1][0] = matrix[i][SIZE - 1];
matrix[i][SIZE - 1] = temp;
}
}
}
cout << "\n\n";
cout<<"После сортировки по возрастанию""\n\n";
printMatrix(matrix, SIZE);
 
return 0;
}
 
//печать массива
void printMatrix(int mx[][12], const int SIZE)
{
for(int i = 0; i < SIZE; i++)
{
 
for(int j = 0; j < SIZE; j++)
cout << setw(4) << mx[i][j];
 
cout << "\n";
}
}
GraBLYA
-46 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 62
15.06.2013, 16:01     Сортировка двумерного массива по возрастанию #18
Сел и задумался над этой задачкой без попыток подсмотреть и у меня за 2 часа пыхтения вот что получилось:
любой массив в памяти записывается последовательно, дополнительные индексы служат лишь упрощением для поиска элементов. Вот я и взял простейший алгоритм сортировки "погружения" или "пузырьковой", добавил бардюр, что бы сортировка не вылезла за пределы массива, и у меня получилась довольно простенькая программа. Возможно варианты выше будут правильнее за счет масштаба, но в случае, если вообще никак не получается вразумить как это работает, мой текст вмещает только все самое элементарное, в нем разберется даже новичек, который с++ знаком на 0 уровне.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//сортировка пузырьком
#include <iostream.h>
 
const int size =4;
 
void print_MAC (int[][size]);   // подключаемая фу-ция для вывода массива
main ()
{   
    int MAC[size][size]={{1,6,2,8},{9,0,7,9},{7,2,4,1},{5,2,1,8}};// предопределенный массив
    print_MAC(MAC);
    
    
    for(int pass=0; pass<(size*size);pass++)//for 1|    проход по всему массиву
    {                                       
        for (int a = 0;a<size;a++)          // for 2|           вторичный проход 
        {   
            for (int b=0;b<size;b++)        // 1 проход  for 3| первичный проход
            {   
                if (a==size-1 && b+1==size)     
                ;                           //пустой оператор для более  
                                            // доходчивого  if'a  
                else                        // "бардюр"
                {
                if (MAC[a][b]>MAC[a][b+1])// меня знак '>' на '<' меняем и  
                                            // сортировку по возрастанию,
                                            // на по убыванию соответственно
                {                                                   
            int hold=MAC[a][b];                         //Сортировка по строке
            MAC[a][b]=MAC[a][b+1];
            MAC[a][b+1]=hold;                           
                }           // сортировка
                }           // закрытие "бардюра"
                
            }               // закрытие for 3
    
        }                   // close for 2
    
    }                       // close for 1
    cout<<endl<<endl;
    print_MAC(MAC);
    return 0;
}
 
 
 
////////////////////////////////////////////////////////////////////////////////
                            // В Ы В О Д   М А С С И В А
////////////////////////////////////////////////////////////////////////////////
void print_MAC (int c[][size])
{   
    cout<<"\n\n";
    for (int A=0; A<size;A++)
    {
        for (int B=0;B<size;B++)
            cout<<c[A][B]<<" ";
        
        cout<<"\n";                     //вывод модифицированного массива
    }
    cout<<"\n\n\n"; 
        
}
////////////////////////////////////////////////////////////////////////////////
Главное помнить, что 5-ый элемент 4-ой строки надо исключать, а то в массив попадет мусор. (MAC[3][4])
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.06.2013, 16:21     Сортировка двумерного массива по возрастанию #19
кто же так двумерные массивы сортирует...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2013, 14:57     Сортировка двумерного массива по возрастанию
Еще ссылки по теме:

Упорядочить строки двумерного массива по возрастанию их наибольших элементов. C++
Сортировка двумерного массива C++
сортировка двумерного массива C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
GraBLYA
-46 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 62
16.06.2013, 14:57     Сортировка двумерного массива по возрастанию #20
Цитата Сообщение от Thinker Посмотреть сообщение
кто же так двумерные массивы сортирует...
я наверно 1-ый

Добавлено через 3 минуты
Цитата Сообщение от Thinker Посмотреть сообщение
кто же так двумерные массивы сортирует...
ведь это все условности двухмерный или двенадцати, только для удобства поиска и яркий пример дискретности
Yandex
Объявления
16.06.2013, 14:57     Сортировка двумерного массива по возрастанию
Ответ Создать тему
Опции темы

Текущее время: 22:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru