Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.99/953: Рейтинг темы: голосов - 953, средняя оценка - 4.99
1 / 1 / 0
Регистрация: 01.02.2009
Сообщений: 4
1

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

07.02.2009, 02:36. Показов 194206. Ответов 26
Метки нет (Все метки)

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

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

С помощью одномерного массива - у меня получилось. А как без него не представляю даже:'(
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2009, 02:36
Ответы с готовыми решениями:

Сортировка строк двумерного массива по возрастанию значений первого столбца
Люди добрые помогите, пожалуйста! Суть задачи такова: 1. Создать двумерный массив 2....

Сортировка массива: сначала положительные по возрастанию, потом отрицательные по возрастанию
Пользователь вводит массив чисел,нужно отсортировать его методом выбора,что бы сначала шли...

Ошибка при сортировке двумерного массива по возрастанию
По убыванию сортировка работает полноценно,а по возрастанию первое число НЕ понимаю откуда...

Упорядочить строки двумерного массива по возрастанию их наибольших элементов.
Нужно упорядочить его строки по возрастанию их наибольших элементов. #include "stdafx.h"...

26
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
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++) {
 
 
    };
 
};
такой цикл пробегает массив в нужном порядке.
0
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. Извините за код. Не разобралась пока, как делать вложения
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
07.02.2009, 03:55 4
Цитата Сообщение от Lyric Посмотреть сообщение
XuTPbIu_MuHTAu, спасибо

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

Но все равно - спасибо за пинок!
Ушла думать
0
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
07.02.2009, 04:37 6
Цитата Сообщение от Lyric Посмотреть сообщение
Но все равно - спасибо за пинок!
Ушла думать
Правильный подход.После того,как отчаешься - помучайся еще полчаса, потом закрой все нафиг,уйди гулять,спать или еще что-нибудь.На следующий день открой заново и просмотри программу всю - сверху вниз,внимательно - если просто не работает.Обычно срабатывает. Если так и не будет идеи - обращайся.
0
181 / 33 / 7
Регистрация: 29.10.2008
Сообщений: 283
07.02.2009, 12:25 7
Чет я тебя не пойму. Используй вложенный цикл, и внутри второго for используй пузырьковую сортировку
0
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 сортировка всего массива
0
181 / 33 / 7
Регистрация: 29.10.2008
Сообщений: 283
10.02.2009, 09:29 9
попробуй использовать условие: если елемент массива[1][3]>елемент массива[2][0] то поменять их местами
0
11 / 11 / 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 месяца всего...так что сильно не пинать...
4
Olgert
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
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();
}
6 / 6 / 0
Регистрация: 01.05.2012
Сообщений: 59
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;
}
2
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 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/inde... 0.B8.D1.8F
1
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);
}
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
04.05.2013, 19:44 16
потому что вопрос задать на форуме не умеешь. Какую именно ошибку? Зачем эти очевидные комментарии? Почему прогу читать невозможно из-за отсутствия тегов и отступов?
Лучше разберись в моём коде. Потому что твой ещё и в два раза больше
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
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";
}
}
0
1 / 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])
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.06.2013, 16:21 19
кто же так двумерные массивы сортирует...
0
1 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 62
16.06.2013, 14:57 20
Цитата Сообщение от Thinker Посмотреть сообщение
кто же так двумерные массивы сортирует...
я наверно 1-ый

Добавлено через 3 минуты
Цитата Сообщение от Thinker Посмотреть сообщение
кто же так двумерные массивы сортирует...
ведь это все условности двухмерный или двенадцати, только для удобства поиска и яркий пример дискретности
0
16.06.2013, 14:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2013, 14:57
Помогаю со студенческими работами здесь

Как отсортировать столбцы двумерного массива по возрастанию (по сумме столбцов)?
Не понимаю, алгоритма сортировки, пожалуйста помогите

Упорядочить по возрастанию все строки двумерного массива, которые неупорядочены по убыванию
как упорядочить по возрастанию все строки двумерного массива, которые неупорядочены по убыванию....

Как составить функцию для отсортировки столбцов двумерного массива по возрастанию ?
Вообще не понимаю принцип действия такой сортировки, кто может помочь и объяснить?

Сортировка двумерного массива
Input sample: 4 10 20 30 7 30 00 23 59 59 13 30 30 Output sample: 7 30 0 10 20 30


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru