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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2011, 13:59   #1
blackbanny
Форумчанин
 
Аватар для blackbanny
 
Регистрация: 02.10.2009
Сообщений: 104
Восклицание рекурсивная сортировка разделением

ниже привел код рекурсивной сортировки разделением, но она сортирует нормально, если в массиве представлены только уникальные элементы, а если появляются одинаковые, то зацикливается...
не могу понять в чем дело...
вызов в main Qsort(0, a.size-1); где a - объект класса vector

Код:
template <class T> void vector<T>::Qsort(int l, int r)
{
   if(l < r)
   {
	   int k = Partition(l, r);
	   Qsort(l, k);
	   Qsort(k+1, r);
   }
}

template <class T> int vector<T>::Partition(int l, int r)
{
	T x = array[(l+r)/2];  
	int i = l;
	int j = r;
	while(1)
	{
	   while(array[j] > x)
	   {
		   j--;
	   }
	   while(array[i] < x)
	   {
		   i++;
	   }
	   if(i < j)
	   {
		   T t = array[i];
			 array[i] = array[j];
			 array[j] = t;
	   } else return j;
	}
}
blackbanny вне форума Ответить с цитированием
Старый 05.01.2011, 14:54   #2
Gongled
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 78
По умолчанию

Полагаю, стоит в одном из циклов while выставить нестрогое условие.

В алгоритм не вникал.
Пишу глупости.

Последний раз редактировалось Gongled; 05.01.2011 в 14:56.
Gongled вне форума Ответить с цитированием
Старый 05.01.2011, 16:17   #3
blackbanny
Форумчанин
 
Аватар для blackbanny
 
Регистрация: 02.10.2009
Сообщений: 104
По умолчанию

Цитата:
Сообщение от Gongled Посмотреть сообщение
Полагаю, стоит в одном из циклов while выставить нестрогое условие.

В алгоритм не вникал.
нет, дело не в этом...
если выставить нестрогие, то прога вообще падает...
blackbanny вне форума Ответить с цитированием
Старый 07.01.2011, 02:21   #4
xPAL
Пользователь
 
Регистрация: 13.01.2008
Сообщений: 34
По умолчанию

Долго искал...
Думаю, что после этого
Код:
 array[j] = t;
напрашивается
Код:
i++;
j--;
. У меня (в упрощенном варианте) работает с этой строчкой.

Последний раз редактировалось xPAL; 07.01.2011 в 02:25.
xPAL вне форума Ответить с цитированием
Старый 07.01.2011, 04:06   #5
Flyasd1
Пользователь
 
Регистрация: 06.01.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Gongled Посмотреть сообщение
Полагаю, стоит в одном из циклов while выставить нестрогое условие.

В алгоритм не вникал.
Он прав так как если у вас в переменной х окажется элемент которому найдется равный в массиве то у вас в определенный момент ни одна из переменных i и j не будут изменятся и получается зацикливание

Последний раз редактировалось Flyasd1; 07.01.2011 в 04:15.
Flyasd1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивная сортировка бургер Паскаль, Turbo Pascal, PascalABC.NET 0 18.05.2010 16:09
рекурсивная функция)) vedro-compota Общие вопросы Delphi 8 16.04.2010 14:39
Рекурсивная функция Trinity13 Помощь студентам 8 14.02.2010 18:44
Рекурсивная процедура Asira Помощь студентам 12 23.12.2009 21:47
Edit с разделением числовых разрядов XPAiN Компоненты Delphi 7 16.04.2008 12:51