Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка циклическим слиянием, помогите плиzzz 
:(
    Опции темы
MegBegb
Дата 23.6.2005, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.5.2005

Репутация: нет
Всего: нет



Помогите пожалуйста!!! Завтра отчитываться по этой сортировке, а сижу уже 4 час и никак не пойму как она работает!!! Взята из книги сортировок и никакого описания! Может кто поможет разобраться как она работает?? Выкладываю полную программу под Borland C 31

Цитата

void sort (int *arr, int st, int en, int med) //Сортировка
{
int *p1, *p2;
p1=new int [med-st+1];
p2=new int [en-med];
int j, k1=0, k2=0;
for(j=st;j<en+1;j++)
{
  if(j<med+1)
  p1[k1++]=arr[j];
  if(j>med)
  p2[k2++]=arr[j];
}
for(j=st, k1=0, k2=0;j<en+1;)
{
  if(k1==med+1-st)              arr[j++]=p2[k2++];
  else if(k2==en-med)            arr[j++]=p1[k1++];
  else if(p1[k1]<p2[k2])        arr[j++]=p1[k1++];
  else if(p1[k1]>=p2[k2])        arr[j++]=p2[k2++];
}
delete p1;
delete p2;
}

void div(int *arr,int st, int en)  //Рекурсивно запускает функцию sort
    с требуемыми параметрами
{
if(en>st)
{
  div(arr,st,st+(en-st)/2);
  div(arr,st+(en-st)/2+1,en);
  sort(arr,st,en,st+(en-st)/2);
}
else  return;
}


Заранее благодарен

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  RGR.CPP 2,88 Kb
PM MAIL   Вверх
yaja
Дата 23.6.2005, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 30.3.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Честно говоря я не понял, почему это сортировка циклическим слиянием, код похож на обычную сортировку слиянием... Интересно что за книга такая?? smile
Работает следующим образом: Если у нас есть два отсортированных куска массива, то мы можем их легко слить в один сортированный кусок. Делается это в твоей функции sliv (согласно RGR.cpp) спомощью двух дополнительных массивов, куда заранее копируются соот. куски общего массива, а затем устанавливаем указатели на начала соот. массивов и сравниваем элементы. Пусть в первом, элемент меньше, тогда мы его копируем на нужное место в большом массиве и увеличиваем счетчик на одни, аналогично в противном случае.
В функции div мы просто для каждого куска запускаем рекурсивно функцию, для двух кусков, которые потом сливаем.
Добавлено @ 21:31
что-то я облажался. написал не туды smile smile smile
Искренне извиняюсь... smile smile

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0398 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.