2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Метод челнока
Сообщение12.03.2010, 22:55 


08/11/09
156
Добрый вечер!
Задали написать написать прогу сортировки методом челнока и отразить число сравнений и перемещений.
Сказал, что неверное число.
Вопрос: как этот метод правильно называется? Сколько сравнений и перемещений он делает при обработке обратно упорядоченного массива?
Спасибо.

 Профиль  
                  
 
 Re: Метод челнока
Сообщение12.03.2010, 23:57 


06/04/09
156
Воронеж
Так вы хотя бы кратко основные идеи озвучьте...

 Профиль  
                  
 
 Re: Метод челнока
Сообщение13.03.2010, 11:23 


08/11/09
156
Нашел еще одно названия - метод пузырька с просеиванием.
Это пузырек, только после нахождения первой неупорядоченной пар идет движение обратно. Потом снова вперед, потом назад. И т.д.
Код такой:
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
{ gt - "больше?", exch - обменять }
p:=1;
r:=n-1;
q:=n-1;
repeat
   for i:=r downto p do
       if gt(items[i-1],items[i],comp) then
                      begin exch(items,i-1,i,trans); q:=i; end;
   p:=q+1;
   for i:=p to r do
                   if gt(items[i-1],items[i],comp) then
                      begin exch(items,i-1,i,trans); q:=i; end;
   r:=q-1;
until q>r;
 

 Профиль  
                  
 
 Re: Метод челнока
Сообщение13.03.2010, 13:29 


08/11/09
156
Понял. Это сортировка перемешиванием, шейкерная сортировка, сортировка просеиванием, сортировка челноком. Вот сколько названий!

Но сколько все же сравнений и перемещений для обратно упорядоченного массива? А для общего случая? Где посмотреть?

 Профиль  
                  
 
 Re: Метод челнока
Сообщение14.03.2010, 10:50 


08/11/09
156
Ну пожалуйста, помогите!

 Профиль  
                  
 
 Re: Метод челнока
Сообщение14.03.2010, 14:09 
Заслуженный участник


09/08/09
3438
С.Петербург
Сколько у Вас получается сравнений и перемещений и почему?
Для проверки можно вставить в Вашу программу два счетчика (один увеличивать при каждом сравнени, другой -- при каждом перемещении) и вывести их значения при завершении сортировки.
Ну а про общий случай почитайте у Кнута (Т.3): http://goo.gl/peu9

 Профиль  
                  
 
 Re: Метод челнока
Сообщение09.04.2010, 18:25 


08/11/09
156
Для упорядоченного массива $\frac{n^2}{2}$ сравнений. В чем дело?

код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
var l, r, j, t: Integer;
begin
comp:=0;
trans:=0;
l:= 1;
r:= n-1;

while l <= r do
      begin

      for j:=l to r do
          if gt(items[j-1],items[j],comp) then
                         exch(items,j-1,j,trans);
      dec(r);

      for j:=r downto l do
          if gt(items[j-1],items[j],comp)then
                         exch(items,j-1,j,trans);
      inc(l);

      end;
 

 Профиль  
                  
 
 Re: Метод челнока
Сообщение09.04.2010, 18:35 
Заслуженный участник


04/05/09
4582
Чтобы было меньше, надо уменьшать границы сканирования не на единицу, а до последнего свопа.

 Профиль  
                  
 
 Re: Метод челнока
Сообщение09.04.2010, 21:36 


08/11/09
156
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
comp:=0;
trans:=0;

l:=1;
r:=n-1;
p:=n-1;

while l<=r
      begin
      for i:=l to r do
          if gt(items[i-1],items[i],comp) then
                         begin exch(items,i-1,i,trans); p:=i; end;
      r:=p-1;

      for i:=r downto l do
          if gt(items[i-1],items[i],comp)then
                         begin exch(items,i-1,i,trans); p:=i; end;
      l:=p+1;
      end;
 

Что-то можно улучшить? Для упорядоченного массива теперь 97 сравнений при длине в 50. Норм?

 Профиль  
                  
 
 Re: Метод челнока
Сообщение09.04.2010, 22:38 
Заслуженный участник


04/05/09
4582
Перед каждым из внутренних циклов присваивать переменной $p$ такое значение, чтобы если обменов не было совсем, то диапазон занулился.
По идее для упорядоченного массива достаточно $length-1$ сравнений.

 Профиль  
                  
 
 Re: Метод челнока
Сообщение13.04.2010, 21:16 


08/11/09
156
Сделал так. Оптимально?
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
comp:=0;
trans:=0;

l:=1;
r:=n-1;

while l<=r
      begin
      p:=1;
      for i:=l to r do
          if gt(items[i-1],items[i],comp) then
                         begin exch(items,i-1,i,trans); p:=i; end;
      r:=p-1;

      p:=n-1;
      for i:=r downto l do
          if gt(items[i-1],items[i],comp)then
                         begin exch(items,i-1,i,trans); p:=i; end;
      l:=p+1;
      end;
 

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group