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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2011, 21:41   #1
a9N2k
Заблокирован
 
Регистрация: 01.02.2011
Сообщений: 44
Печаль Проблема Шейкер-сортировки vs алгоритма простого слияния...

Добрый вечер, уважаемые форумчане.
Возникла проблема с работой программы...
Есть такое задание: сравнить длительность работы, кол-во сравнений и присваиваний двух алгоритмов сортировки: шейкер-сортировка и простым слиянием;
Вот код:
Код:
program Sort;
{$APPTYPE CONSOLE}
uses
  SysUtils, Windows;

const
  n=100000;
  max_num=1000000;

type
  mas = array [0..n-1] of integer;

var
  m:mas;
  i:integer;
  pris:integer = 0;
  sravn:integer = 0;
  time:integer = 0;

//shaker-sortirovka
procedure ShakeSort;
var
  i,j,b,e,t:integer;
begin
  Randomize;
  b := 1;
  e := n;
  for j := 1 to n-1 do
      begin
         if (j mod 2)=1 then
            begin
              for i := 1 to e-1 do
                  begin
                    inc(sravn);
                    if m[i] > m[i+1] then
                       begin
                          inc(pris);
                          t := m[i];
                          m[i] := m[i+1];
                          inc(pris);
                          m[i+1] := t;
                          inc(pris);
                        end;
                  end;
                   e := e - 1;
             end
           else
            begin
              for i := e-1 downto b+1 do
                  begin
                    inc(sravn);
                      if m[i] < m[i-1] then
                         begin
                            t := m[i];
                            inc(pris);
                            m[i] := m[i+1];
                            inc(pris);
                            m[i+1] := t;
                            inc(pris);
                          end;
                   end;
              b := b + 1;
             end;
      end;
end;
a9N2k вне форума Ответить с цитированием
Старый 05.02.2011, 21:43   #2
a9N2k
Заблокирован
 
Регистрация: 01.02.2011
Сообщений: 44
По умолчанию

Код:
//prostoe sliyanie
procedure MergeSort(var Arr : mas; N : Integer);
var
    C : Boolean;
    I : Integer;
    I1 : Integer;
    I2 : Integer;
    N1 : Integer;
    N2 : Integer;
    BArr : Mas;
    MergeLen : Integer;
begin
    MergeLen := 1;
    c := True;
    while MergeLen<n do
          begin
             if C then
                begin
				  inc(sravn);
				  i := 0;
				  while i+MergeLen<=n do
					   begin
						i1 := i+1;
						i2 := i+MergeLen+1;
						n1 := i+MergeLen;
						n2 := i+2*MergeLen;
						if n2>n then
						   begin
							 n2 := n;
                            end;
                  while (i1<=n1) or (i2<=n2) do
                        begin
                          if i1>n1 then
                             begin
                               while i2<=n2 do
                                     begin
                                       i := i+1;
                                       BArr[i-1] := Arr[i2-1];
                                       inc(pris);
                                       i2 := i2+1;
                                      end;
                              end
                             else
                              begin
                          if i2>n2 then
                             begin
                               while i1<=n1 do
                                   begin
                                     i := i+1;
                                     BArr[i-1] := Arr[i1-1];
                                     inc(pris);
                                     i1 := i1+1;
                                    end;
                              end
                             else
                              begin
                                inc(sravn);
                                if Arr[i1-1]>Arr[i2-1] then
                                   begin
                                     i := i+1;
                                     BArr[i-1] := Arr[i2-1];
                                     inc(pris);
                                     i2 := i2+1;
                                    end
                                  else
                                    begin
                                      i := i+1;
                                      BArr[i-1] := Arr[i1-1];
                                      inc(pris);
                                      i1 := i1+1;
                                     end;
                               end;
                         end;
                   end;
            end;
            i := i+1;
            while i<=n do
            begin
                BArr[i-1] := Arr[i-1];
                inc(pris);
                i := i+1;
            end;
        end
        else
        begin
            i := 0;
            while i+MergeLen<=n do
            begin
                i1 := i+1;
                i2 := i+MergeLen+1;
                n1 := i+MergeLen;
                n2 := i+2*MergeLen;
                if n2>n then
                begin
                    n2 := n;
                end;
                while (i1<=n1) or (i2<=n2) do
                begin
                    if i1>n1 then
                    begin
                        while i2<=n2 do
                        begin
                            i := i+1;
                            Arr[i-1] := BArr[i2-1];
                            inc(pris);
                            i2 := i2+1;
                        end;
                    end
                    else
                    begin
                        if i2>n2 then
                        begin
                            while i1<=n1 do
                            begin
                                i := i+1;
                                Arr[i-1] := BArr[i1-1];
                                inc(pris);
                                i1 := i1+1;
                            end;
                        end
                        else
                        begin
                            inc(sravn);
                            if BArr[i1-1]>BArr[i2-1] then
                            begin
                                i := i+1;
                                Arr[i-1] := BArr[i2-1];
                                inc(pris);
                                i2 := i2+1;
                            end
                            else
                            begin
                                i := i+1;
                                Arr[i-1] := BArr[i1-1];
                                inc(pris);
                                i1 := i1+1;
                            end;
                        end;
                    end;
                end;
            end;
a9N2k вне форума Ответить с цитированием
Старый 05.02.2011, 21:43   #3
a9N2k
Заблокирован
 
Регистрация: 01.02.2011
Сообщений: 44
По умолчанию

Код:
            i := i+1;
            while i<=n do
            begin
                Arr[i-1] := BArr[i-1];
                inc(pris);
                i := i+1;
            end;
        end;
        MergeLen := 2*MergeLen;
        c :=  not C;
    end;
    if  not C then
    begin
        i := 1;
        repeat
            Arr[i-1] := BArr[i-1];
            inc(pris);
            i := i+1;
        until  not (i<=n);
    end;
end;
//osnovnoe telo programmy
var
 tm:cardinal;
begin
 randomize;
//  for i := 1 to n do m[i] := n-i;
  for i := 1 to n do m[i] := random(max_num);
  tm := GetTickCount;
  ShakeSort;
  //MergeSort(m,n);
  writeln('Time:=',GetTickCount - tm);
  writeln('sravnenii=',sravn);
  writeln('prisvaivanii=',pris);
  readln(tm);
end.

проблема в том, что на последнем сравнении, оно должно быть в 10 раз больше предыдущего, а получается что только в 31 раз больше. Алгоритм вроде бы работает правильно, как показали предыдущие результаты. Именно на этом моменте препод и зациклился...Не сдал я эту лабу...
Вообщем, помогите, может быть кто-нибудь увидит ошибку..
a9N2k вне форума Ответить с цитированием
Старый 06.02.2011, 02:18   #4
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

пока еше не разобрался, но ето помоиму надо исправить
Код:
  for i := 0 to n -1 do m[i] := random(max_num);
еше не рабочее, но если кто нибудь захочет помоч, думаю ему будет легче читаь от сюда
Вложения
Тип файла: rar Sortirovki.rar (166.1 Кб, 8 просмотров)
VirusN13

Последний раз редактировалось ArtGrek; 06.02.2011 в 03:14.
ArtGrek вне форума Ответить с цитированием
Старый 06.02.2011, 03:33   #5
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Подобные ошибки - это ограничения либо переполнения !
integer для Windows 4 байта.
Это значит число 2 в 32 степени разрядов.
6 миллиардов с лишним там никак не может храниться
An1ka вне форума Ответить с цитированием
Старый 06.02.2011, 12:43   #6
a9N2k
Заблокирован
 
Регистрация: 01.02.2011
Сообщений: 44
По умолчанию

An1ka, большое спасибо!!!
Ups.. Вот что случается с теми, кто привык к паскалевским типам переменных)
А вот он и результат:
a9N2k вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STL реализация алгоритма сортировки в классе Progsenya Общие вопросы C/C++ 0 09.09.2010 21:36
Визуальное моделирование метода сортировки многопутевого слияния flop Помощь студентам 0 09.06.2010 22:30
Визуализация алгоритма блочной сортировки Tomogochi Фриланс 6 03.06.2010 19:17
Визуализация алгоритма блочной сортировки Tomogochi Помощь студентам 1 25.05.2010 10:45
Разработка алгоритма сортировки методом простых вставок Delphi Hetsil Помощь студентам 0 12.12.2009 21:51