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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2014, 14:46   #1
IceTony
Новичок
Джуниор
 
Регистрация: 18.01.2014
Сообщений: 2
По умолчанию Разобраться в коде

Алгоритм сортирует элементы матрицы согласно схеме (см. изображение), в порядке убывания и методом пузырька. Происходит движение:
1) вниз или влево
2) по диагонали вверх-влево
3) влево или вниз
4) по диагонали вниз-вправо
5) алгоритм повторяется пока не упрется в левый-нижний угол

Алгоритм мне понятен, но сам код не очень. Кто нибудь может его подробно разжевать?

Код:
void Sort(int ** ptr, int n, int m)
{
	//	Algorythm
	// move down or left
	// move diag up-left
	// move left or down
	// move diag down-right
	// repeat
	int count = 0;
	int i = 0, j = 0;
	int i_prev = 0, j_prev = 0;
	bool is_end = false;
	while(!(count == n * m))
	{
		i = 0; j = m - 1; is_end = false;
		while(!(i == n - 1 && j == 0))
		{
			// move down or left
			i_prev = i;
			j_prev = j;
			if(i + 1 < n)
				i++;
			else
				if(j - 1 >= 0)
					j--;
				else
					is_end = true;
			if(ptr[i][j] > ptr[i_prev][j_prev])
			{
				int temp = ptr[i][j];
				ptr[i][j] = ptr[i_prev][j_prev];
				ptr[i_prev][j_prev] = temp;
			}
			if(is_end)
				break;
			// move diag up - left
			while(i > 0 && j > 0)
			{
				i_prev = i;
				j_prev = j;
				i--;j--;
				if(ptr[i][j] > ptr[i_prev][j_prev])
				{
					int temp = ptr[i][j];
					ptr[i][j] = ptr[i_prev][j_prev];
					ptr[i_prev][j_prev] = temp;
				}
			}
			// move left or down
			i_prev = i;
			j_prev = j;
			if(j > 0)
				j--;
			else
				if(i + 1 < n)
					i++;
				else
					is_end = true;
			if(ptr[i][j] > ptr[i_prev][j_prev])
			{
				int temp = ptr[i][j];
				ptr[i][j] = ptr[i_prev][j_prev];
				ptr[i_prev][j_prev] = temp;
			}
			if(is_end)
				break;
			// move diag down
			while(i + 1 < n && j + 1 < m)
			{
				i_prev = i;
				j_prev = j;
				i++;j++;
				if(ptr[i][j] > ptr[i_prev][j_prev])
				{
					int temp = ptr[i][j];
					ptr[i][j] = ptr[i_prev][j_prev];
					ptr[i_prev][j_prev] = temp;
				}
			}
		}
		count++;
	}
}
Изображения
Тип файла: jpg Безымянный.jpg (10.0 Кб, 73 просмотров)

Последний раз редактировалось IceTony; 18.01.2014 в 14:47. Причина: корректировка
IceTony вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разобраться в коде MartinSeptim Общие вопросы C/C++ 4 21.02.2012 18:13
Не получается разобраться в коде stck Общие вопросы C/C++ 5 22.12.2011 17:24
не могу разобраться в коде zif0rka PHP 6 05.12.2011 01:22