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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Lyric
1 / 1 / 0
Регистрация: 01.02.2009
Сообщений: 4
#1

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

07.02.2009, 02:36. Просмотров 43818. Ответов 21
Метки нет (Все метки)

Помогите, пожалуйста с задачей.
Необходимо отсортировать двумерный массив по возрастанию (не переводя его в одномерный).

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

С помощью одномерного массива - у меня получилось. А как без него не представляю даже:'(
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2009, 02:36     Сортировка двумерного массива по возрастанию
Посмотрите здесь:
Сортировка строк двумерного массива по возрастанию значений первого столбца C++
Сортировка массива: сначала положительные по возрастанию, потом отрицательные по возрастанию C++
Ошибка при сортировке двумерного массива по возрастанию C++
Упорядочить строки двумерного массива по возрастанию их наибольших элементов. C++
C++ Как отсортировать столбцы двумерного массива по возрастанию (по сумме столбцов)?
C++ Упорядочить по возрастанию все строки двумерного массива, которые неупорядочены по убыванию
C++ Как составить функцию для отсортировки столбцов двумерного массива по возрастанию ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
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
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
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
07.02.2009, 03:55     Сортировка двумерного массива по возрастанию #4
Цитата Сообщение от Lyric Посмотреть сообщение
XuTPbIu_MuHTAu, спасибо

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

Но все равно - спасибо за пинок!
Ушла думать
XuTPbIu_MuHTAu
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
07.02.2009, 04:37     Сортировка двумерного массива по возрастанию #6
Цитата Сообщение от Lyric Посмотреть сообщение
Но все равно - спасибо за пинок!
Ушла думать
Правильный подход.После того,как отчаешься - помучайся еще полчаса, потом закрой все нафиг,уйди гулять,спать или еще что-нибудь.На следующий день открой заново и просмотри программу всю - сверху вниз,внимательно - если просто не работает.Обычно срабатывает. Если так и не будет идеи - обращайся.
Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
07.02.2009, 12:25     Сортировка двумерного массива по возрастанию #7
Чет я тебя не пойму. Используй вложенный цикл, и внутри второго for используй пузырьковую сортировку
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
Сообщений: 49
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
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2013, 18:23     Сортировка двумерного массива по возрастанию
Еще ссылки по теме:
C++ Сортировка двумерного массива
Сортировка Двумерного массива C++
C++ Сортировка двумерного массива
Сортировка двумерного массива C++
C++ Сортировка двумерного массива

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

Или воспользуйтесь поиском по форуму:
Туся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);
}
Yandex
Объявления
04.05.2013, 18:23     Сортировка двумерного массива по возрастанию
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru