Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2016, 20:10   #1
anstsiya
 
Регистрация: 23.06.2015
Сообщений: 9
Восклицание Упорядочить матрицу по возрастанию значений в строках по столбцам

Задача состоит в том, чтобы упорядочить матрицу по возрастанию значений в строках по столбцам. Если в столбце нашлись совпадающие значения, то переходить на следующий столбец и упорядочивать по нему, и т.д
Например, если исходное
1 7 3 4
1 2 4 3
1 2 1 4
то должно получиться
1 2 1 4
1 2 4 3
1 7 3 4
Перерыла много подобных тем, там везде однотипные сортировки пузырьком, как и у меня.
Но проблема в том, что если матрица, например, 5 х 5 и у нее совпадают все числа в первом,втором и третьем столбце, то по четвертому и пятому уже не сортирует. Проверила и на матрице проще и меньше, и оказалось, что оно сортирует только по первому столбику. Как можно изменить этот код так, чтобы сортировка строк проверялась на совпадающие и происходила по всем столбцам
Преподаватель что-то говорил о лексикографическом упорядочивании, но ничего кроме такого же пузырька и в такой формулировке я не нашла
Код:
#include <stdio.h>
#include <conio.h>
 
int main()
{
 int i,j;
 int m,n;
int x,y;
 
printf("\nEnter number of rows matrix A \n");//Введите количество строк матрицы А column
 scanf("%d",&m);
 
 printf("\nEnter number of columns matrix A \n");//Введите количество столбцов матрицы А
  scanf("%d",&n);
 
  float A[m][n];
 
    printf("\nEnter matrix A %d x %d elements \n",m,n);//Bведите матрицу A
    for (i=0; i<m; i++)
    {
 
        printf("\nElements of %d row: \n",i+1);//Элементы %d-й строки
            for (j=0; j<n; j++)
        {
            printf("Elem A [%d][%d]",i+1,j+1);
            scanf("%f", &A[i][j]);
        }
    }
    printf("\nMatrix A: \n");//Матрица А
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        {
            printf("%f\t",A[i][j]);
        }
    printf("\n");
    }
 
for(y=0; y<m; y++)
    {
        for (i=0; i<(m-1); i++)
        {
            if(A[i][0]>A[i+1][0])
            {
                for(j=0; j<n; j++)
                {
                    x=A[i][j];
                    A[i][j]=A[i+1][j];
                    A[i+1][j]=x;
                }
            }
        }
    }
    printf("\n");
 
  printf("\nSorted matrix A: \n");//Сортированная матрица
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        {
            printf("%f\t",A[i][j]);
        }
            printf("\n");
    }
 
 
printf("\n");
 
}
anstsiya вне форума Ответить с цитированием
Старый 25.06.2016, 21:32   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Слушай, а ты не пробывала представлять строчки таблицы в виде чисел, которые можно сравнивать между собой?




Из недостатков:
1) если элемент матрицы равен, скажем 13, то он повлияет на следующий элемент. Можно выйти из положения умножая не на 10, а на 100
2) ограничение типа Си (где то 10 десятичном знаков), а формируемое число быстро набирает разряды.
ura_111 вне форума Ответить с цитированием
Старый 25.06.2016, 23:12   #3
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

А я не пойму принцип сортировки.
Каждый столбец сортируем? Тогда почему в 3-м столбце обменяли крайние числа, а в 4-м столбце оставили без изменения?
FPaul вне форума Ответить с цитированием
Старый 25.06.2016, 23:38   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Условия мин/макс смотрим по столбцах, а тусуем - строчки целиком.

Поясняю. Дано:

1 7 3 4
1 2 4 3
1 2 1 4

1) шаг смотрим на 1-й столбец
1 7 3 4
1 2 4 3
1 2 1 4
Все равны (равны 1-це). - ни одну строчку перетасовывать не будем (ни одно строчка по этому столбцу "не тяжелей" остальных).

2) Смотрим на 2-й столбец
1 7 3 4
1 2 4 3
1 2 1 4
Самая тяжелая строчка, где 7-ка (т.е. 1 7 3 4) - опускается её полностью в низ. Получаем:
1 2 4 3
1 2 1 4
1 7 3 4 - на последнюю строчку уже не обращаем внимание.

3) Теперь смотрим на остальные числа в 2-м столбце
1 2 4 3
1 2 1 4
1 7 3 4
Они равны - переходим на следующий солбец

4) Смотрим на 3-столбец.
1 2 4 3
1 2 1 4
1 7 3 4
значит строка в которой 4 (т.е. 1 2 4 3) "тяжелей" строчки где 1-я (т.е. 1 2 1 4 ), значит она "опускается в низ". Получаем
1 2 1 4
1 2 4 3
1 7 3 4

Все, задача решена.

Последний раз редактировалось ura_111; 25.06.2016 в 23:49.
ura_111 вне форума Ответить с цитированием
Старый 25.06.2016, 23:46   #5
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Ага, значит переставляем строки, и сравниваем строки поэлементно слева-направо.
Если "в лоб", то подойдёт и модификация "пузырька".
-----------------------------
вот примерно так (сильно не пинайте, языком плохо владею)
Код:
#include <iostream>

using namespace std;
int cmp(int a[], int b[],int n)
{
    for(int i=0; i<n; i++)
    {
        if (a[i]<b[i])
            return -1;
        else
        {
            if(a[i]>b[i])
                return 1;
        }
    }
    return 0;
}

void swap(int a[],int b[],int n)
{
    for(int i=0; i<n; i++)
    {
        int t=a[i];
        a[i]=b[i];
        b[i]=t;
    }
}

int main()
{
    int n=3;
    int m=4;
    int a[3][4]=
    {
        {1, 7, 3, 4},
        {1, 2, 4, 3},
        {1, 2, 1, 4}
    };
    cout<<"before:\n";
    for (int i=0 ; i<n; i++)
    {
        for(int j=0 ; j<m; j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<"\n";
    };
    cout<<"after:\n";
    //сортировка "пузырьком"
    for(int i=0; i<n; i++)
    {
        for(int j=n-1; j>i; j--)
        {
            if(cmp(a[j-1],a[j],m)==1)
            {
                swap(a[j-1],a[j],m);
            };
        };
    }

    for (int i=0 ; i<n; i++)
    {
        for(int j=0 ; j<m; j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<"\n";
    };
    return 0;
}
Ага, только сейчас заметил, что у меня C++, а у ТС - C. Но, за исключением ввода-вывода различий тут нет. Надеюсь, ТС поймёт, что к чему.

Последний раз редактировалось FPaul; 26.06.2016 в 00:42. Причина: накосячил в сортировке
FPaul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
упорядочить данные по возрастанию числовых значений stalin765 Помощь студентам 7 04.06.2012 19:15
Упорядочить элементы по возрастанию их кодов. vinternete Помощь студентам 2 14.07.2011 08:18
Упорядочить колонки матрицы по возрастанию wlll Помощь студентам 8 27.11.2010 09:06
Упорядочить колонки матрицы по возрастанию wlll Помощь студентам 2 25.11.2010 17:14
Упорядочить по возрастанию элементы.. TemaTim Паскаль, Turbo Pascal, PascalABC.NET 2 16.05.2009 19:00