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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2011, 22:19   #1
Денис16
 
Регистрация: 03.08.2011
Сообщений: 4
По умолчанию сортировки

Доброго времени суток!
Прошу помощи. Есть программа с двумя методами сортировки: Шелла и слиянием. Сортировка Шелла работает нормально, а вот слиянием выдает вообще какую-то ерунду. Помогите пожалуйста найти ошибку.
Обратите внимание, что выходной массив при сортировке слиянием получается далеко не тот, который формируется изначально.
Код:
Program Sort;
uses crt,graph;
const NN:array[1..10] of integer=(20,40,60,80,100,120,140,160,180,200);
type t=array[1..1000] of integer;
var
  aa:t;
  s,c:integer;
  n:integer;
  p:integer;
  u:integer;
  Driver,Mode,Error,i:integer;
  m,l,r,per:integer;
  st:string;
procedure Sort_Shell(var b:t;var m,c,p:integer); {Процедура сортировки Шелла}
var i,j,k,step,l,x:integer;
begin
 l:=m;
 step:=l div 2;
 while step>0 do
 begin
  for i:=1 to l-step do
   begin
    j:=i;
    while (j>=1) and (b[j]>b[j+step]) do
     begin
      inc(c);
      x:=b[j];
      b[j]:=b[j+step];
      b[j+step]:=x;
      dec(j);
     end;
    inc(p);
    end;
  step:=step div 2;
 end;
end;     {Конец процедуры сортировки Шелла}
Procedure sl(var a:t; p,q:integer);{Процедура, сливающая массивы}
 var r,i,j,k:integer;
     b:t;
  begin
   r:=(p+q) div 2;
   i:=p; j:=r+1;
    for k:=p to q do
    if (i<=r) and ((j>q) or (a[i]<a[j])) then
     begin
      inc(u);
      b[k]:=a[i];inc(i);
     end
     else
       begin
        b[k]:=a[j]; inc(j);inc(per);
       end;
     for k:=p to q do
     a[k]:=b[k];
  end;
Procedure sort_slij(var a:t; p,q:integer);
 begin
  if p<q then
   begin
    sort_slij(a,p,(p+q) div 2);
    sort_slij(a,(p+q) div 2+1,q);
    sl(a,p,q);
   end;
 end;
begin
clrscr;
randomize;
for i:=1 to 10 do
 begin
  n:=NN[i];
  writeln('Начальный массив при n= ',n);
  for s:=1 to n do
  begin
   aa[s]:=random(100);
   write(aa[s],' ');
  end;
 writeln;
readln;
end;
clrscr;
{Сортировка массива по методу Шелла}
 writeln('Сортировка массива по методу Шелла:');
 for i:=1 to 10 do
  begin
  n:=NN[i];
  Sort_Shell(aa,n,c,p);
  writeln('Отсортированный массив при n= ',n);
   for s:=1 to n do write(aa[s],' ');
    writeln;
    writeln('Количество сравнений равно ',p);
    writeln('Количество перестановок равно ',c);
    writeln;
    readln;
  end;
{Сортировка массива слиянием}
 writeln('Сортировка массива слиянием');
 for i:=1 to 10 do
  begin
  n:=NN[i]; 
  sort_slij(aa,1,n);
 writeln('Отсортированный массив при n= ',n);
  for s:=1 to n do write(aa[s],' ');
   writeln;
   writeln('Количество сравнений равно ',u);
   writeln('Количество перестановок равно ',per);
   writeln;
   readln;
  end;
end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 05.08.2011 в 08:24.
Денис16 вне форума Ответить с цитированием
Старый 03.08.2011, 22:53   #2
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

"выдает ерунду" - это ошибочка заложена в момент написания, не помню ее номер
1. При формировании массивов используется один и тот же массив. Следовательно для первой сортировки используются первые 20 элементов сформированных для 200 элементов, а не тот что показывается пользователю для N=20 ...
2. На втором и далее шаге (для N= 40, 60 ...) первые элементы уже упорядочены.
3. Когда доходит очередь до метода сортировки слиянием, массив уже отсортирован
ЗЫ сформируйте массив с максимальным количеством элементов и для сортировки берите первые его N элементов. И обязательно пересылайте их значения в сортируемый (другой) массив перед каждой сортировкой
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 04.08.2011, 19:12   #3
Денис16
 
Регистрация: 03.08.2011
Сообщений: 4
По умолчанию

Большое спасибо! Разобрался. Если можно, еще вопрос. При сортировке методом Шелла на последних 3-4 значениях n почему-то количество перестановок превышает количество сравнений (что в принципе быть не может). Подскажите куда можно поставить счетчик, чтобы считал правильно?
Денис16 вне форума Ответить с цитированием
Старый 22.02.2012, 20:46   #4
frm user
Новичок
Джуниор
 
Регистрация: 20.02.2012
Сообщений: 2
По умолчанию

Круто молодец
frm user вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировки Sunless Помощь студентам 0 04.04.2011 17:42
сортировки Christi93 Общие вопросы C/C++ 2 19.12.2010 12:15
Сортировки в BP 7 ! wArRrrr Помощь студентам 2 07.10.2008 18:56