Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сортировка матрицы

44K
22 июня 2010 года
m9yt
25 / / 27.02.2010
Привет всем!
Прошу помощи в непростой, на мой взгляд, задаче.
Заранее скажу, что код - не самое важное. Главное - это алгоритм, хочу разобраться как именно вначале делать, а потом уже кодить.
А задача следующая:
Дана квадратная матрица. Упорядочить строки матрицы по убыванию элементов ее главной диагонали.
Еще раз повторюсь, для меня тут сложен механизм работы с индексами.
Заранее спасибо.
2.1K
22 июня 2010 года
Norgat
452 / / 12.08.2009
сортировку пузырьком знаешь?) если нет, то http://www.cyberguru.ru/cpp-sources/algorithms/sortirovka-puzyrkom.html

вот тебе рисунок матрицы с отмеченной главной диагональю: http://www.nsu.ru/matlab/Exponenta_RU/educat/class/test/4/glavdiag.asp.htm

тебе остаётся взять код для пузырька и добавить в индексацию эл-та строки... т.е.
вместо array пишешь array

идея понятна?

п.с. не забудь, что индексация элементов массивов начинается с 0.
44K
22 июня 2010 года
m9yt
25 / / 27.02.2010
Подогнал к своей задаче:
Код:
void sort(int matr [][4])
{
    int i, j, trash;
    for (int i=0; i<4 ; i++)
        {
            for (int j=0; j<4; j++)
            {
                if (matr>matr[i+1][i+1])
                {
                    trash=matr[j];
                    matr[j]=matr[i+1][j];
                    matr[i+1][j]=trash;
                }
            }
        }
}


вылетает с ошибкой stack around the variable 'matr' was corruped
2.1K
22 июня 2010 года
Norgat
452 / / 12.08.2009
на вскидку...

сделай цикл for (int i=0; i<3 ; i++)
т.к. у тебя if (matr>matr[i+1][i+1]) при i = 3 вылезет за размерность матрицы


п.с. trash - должен быть одномерным массивом размерности 4, т.к. тебе нужно поменять местами строки матрицы, а не элементы гл. диагонали.

п.с.с. да и знак > в if (matr>matr[i+1][i+1]) наверно нужно поменять на <
44K
22 июня 2010 года
m9yt
25 / / 27.02.2010
Цитата: Norgat
на вскидку...

сделай цикл for (int i=0; i<3 ; i++)
т.к. у тебя if (matr>matr[i+1][i+1]) при i = 3 вылезет за размерность матрицы


п.с. trash - должен быть одномерным массивом размерности 4, т.к. тебе нужно поменять местами строки матрицы, а не элементы гл. диагонали.


Ошибка исчезла, но сортирует неправильно(думаю, эта версия сортирует по возрастанию)
сделал вот так:

Код:
void sort(int matr [][4])
{
    int i, j, trash;
    for (int i=0; i<4 ; i++)
        {
            for (int j=3; j>i-1; j--)
            {
                if (matr[i+1][i+1]>matr)
                {
                    trash=matr[i+1][j];
                    matr[i+1][j]=matr[j];
                    matr[j]=trash;
                }
            }
        }
}

Для матрицы выдает:
5 3 4 3
9 9 5 7
4 8 2 7
4 6 9 2

5 9 5 7 //5 из 1 строки не поменлась с 9 из 2 строки
9 3 4 3
4 8 2 7
4 6 9 2
2.1K
22 июня 2010 года
Norgat
452 / / 12.08.2009
читай ещё раз и внимательно:
Цитата: Norgat

п.с. trash - должен быть одномерным массивом размерности 4, т.к. тебе нужно поменять местами строки матрицы, а не элементы гл. диагонали.



а если менять местами просто эл-ты гл. диагонали, то зачем используется индекс j?

 
Код:
if (matr[i+1][i+1]>matr)
{
    trash=matr[i+1][j];
    matr[i+1][j]=matr[j];
    matr[j]=trash;
}

надо бы:
 
Код:
trash = matr[i+1][i+1];
matr[i+1[i+1] = matr;
matr = trash;
44K
22 июня 2010 года
m9yt
25 / / 27.02.2010
Цитата: Norgat
читай ещё раз и внимательно:



так что ли: int trash[4];
Тогда как к нему обращаться в цикле?

2.1K
22 июня 2010 года
Norgat
452 / / 12.08.2009
Цитата: m9yt
так что ли: int trash[4];
Тогда как к нему обращаться в цикле?



как к обычному массиву, включи логику.

44K
22 июня 2010 года
m9yt
25 / / 27.02.2010
Цитата: Norgat
читай ещё раз и внимательно:


а если менять местами просто эл-ты гл. диагонали, то зачем используется индекс j?
 
Код:
if (matr[i+1][i+1]>matr)
{
    trash=matr[i+1][j];
    matr[i+1][j]=matr[j];
    matr[j]=trash;
}

надо бы:
 
Код:
trash = matr[i+1][i+1];
matr[i+1[i+1] = matr;
matr = trash;


индекс j здесь используется для обмена строк. т.е. мы меняем строки , двигаясь по стобцам и меняем элементы одной строки с другой, находящейся на i+1 ниже

8.4K
23 июня 2010 года
z0rch
275 / / 02.09.2008
делать trash массивом глупо, правильно потом Norgat поправился ("надо бы"), просто
 
Код:
for(int i=0;i<n;i++)
  for(int j=0;j<n;j++)
     if(arr[j][j] > arr)
       for(int k=0;k<n;k++)
       {
          temp=arr[j][k];
          arr[j][k]=arr[k];
          arr[k]=temp;
        }
87
24 июня 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: m9yt
А задача следующая:
Дана квадратная матрица. Упорядочить строки матрицы по убыванию элементов ее главной диагонали.



Тут ещё уточнение нужно. Так как мы поменяем строки, то и диагональ вся перемешается. Должны ли строки в получившейся матрице быть упорядочены по убыванию элементов её главной диагонали?

Если да, то пока у меня кроме тупого подбора идей нет. Или я не понял о чём говорили до меня.

8.4K
24 июня 2010 года
z0rch
275 / / 02.09.2008
точно, диагональ же снова перемешается.
тогда, если надо по убыванию исходной диагонали, то можно сначала пройтись по массиву и записать порядок строк по условию убывания диагонали, а потом, согласно порядку, переставлять сами строки.
а если нужно убывание в конечной матрице, то, скорее всего, только перебором, можно мой предыдущий код обернуть в еще один цикл с условиями "перестановки не производились" и "зациклилось" (например строки 5 3 и 1 6 будут бесконечно менятся друг с другом)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог