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;
}
}
}
}
Сортировка матрицы
Прошу помощи в непростой, на мой взгляд, задаче.
Заранее скажу, что код - не самое важное. Главное - это алгоритм, хочу разобраться как именно вначале делать, а потом уже кодить.
А задача следующая:
Дана квадратная матрица. Упорядочить строки матрицы по убыванию элементов ее главной диагонали.
Еще раз повторюсь, для меня тут сложен механизм работы с индексами.
Заранее спасибо.
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.
сортировку пузырьком знаешь?) если нет, то
вот тебе рисунок матрицы с отмеченной главной диагональю: http://www.nsu.ru/matlab/Exponenta_RU/educat/class/test/4/glavdiag.asp.htm
тебе остаётся взять код для пузырька и добавить в индексацию эл-та строки... т.е.
вместо array пишешь array
идея понятна?
п.с. не забудь, что индексация элементов массивов начинается с 0.
Подогнал к своей задаче:
сделай цикл 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]) наверно нужно поменять на <
Цитата: Norgat
на вскидку...
сделай цикл for (int i=0; i<3 ; i++)
т.к. у тебя if (matr>matr[i+1][i+1]) при i = 3 вылезет за размерность матрицы
п.с. trash - должен быть одномерным массивом размерности 4, т.к. тебе нужно поменять местами строки матрицы, а не элементы гл. диагонали.
сделай цикл 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;
}
}
}
}
{
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
Цитата: 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][j];
matr[i+1][j]=matr[j];
matr[j]=trash;
}
надо бы:
Код:
trash = matr[i+1][i+1];
matr[i+1[i+1] = matr;
matr = trash;
matr[i+1[i+1] = matr;
matr = trash;
Цитата: Norgat
читай ещё раз и внимательно:
так что ли: int trash[4];
Тогда как к нему обращаться в цикле?
Цитата: m9yt
так что ли: int trash[4];
Тогда как к нему обращаться в цикле?
Тогда как к нему обращаться в цикле?
как к обычному массиву, включи логику.
Цитата: Norgat
читай ещё раз и внимательно:
а если менять местами просто эл-ты гл. диагонали, то зачем используется индекс j?
надо бы:
а если менять местами просто эл-ты гл. диагонали, то зачем используется индекс 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][j];
matr[i+1][j]=matr[j];
matr[j]=trash;
}
надо бы:
Код:
trash = matr[i+1][i+1];
matr[i+1[i+1] = matr;
matr = trash;
matr[i+1[i+1] = matr;
matr = trash;
индекс j здесь используется для обмена строк. т.е. мы меняем строки , двигаясь по стобцам и меняем элементы одной строки с другой, находящейся на i+1 ниже
поправился ("надо бы"), просто
делать 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;
}
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;
}
Цитата: m9yt
А задача следующая:
Дана квадратная матрица. Упорядочить строки матрицы по убыванию элементов ее главной диагонали.
Дана квадратная матрица. Упорядочить строки матрицы по убыванию элементов ее главной диагонали.
Тут ещё уточнение нужно. Так как мы поменяем строки, то и диагональ вся перемешается. Должны ли строки в получившейся матрице быть упорядочены по убыванию элементов её главной диагонали?
Если да, то пока у меня кроме тупого подбора идей нет. Или я не понял о чём говорили до меня.
тогда, если надо по убыванию исходной диагонали, то можно сначала пройтись по массиву и записать порядок строк по условию убывания диагонали, а потом, согласно порядку, переставлять сами строки.
а если нужно убывание в конечной матрице, то, скорее всего, только перебором, можно мой предыдущий код обернуть в еще один цикл с условиями "перестановки не производились" и "зациклилось" (например строки 5 3 и 1 6 будут бесконечно менятся друг с другом)