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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2013, 16:25   #1
lialia
Форумчанин
 
Регистрация: 08.12.2012
Сообщений: 116
По умолчанию Сортировки

Здраствуйте,помогите пожалуйста,если не сложно,нужно сделать 3 сортировки в одной прогр(выбором,двоич. включения,и пузырьком),и чтобы был выбор рандомом или пользователь сам вводит элементы массива,я пробовала ,но у меня не получается(
lialia вне форума Ответить с цитированием
Старый 31.03.2013, 16:43   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Извините, но мы Ваших проб здесь не видим.
s-andriano вне форума Ответить с цитированием
Старый 31.03.2013, 16:50   #3
lialia
Форумчанин
 
Регистрация: 08.12.2012
Сообщений: 116
По умолчанию

Код:
uses dos,crt;
const size=10000;
d=10;
type mas=ARRAY[1..size] OF INTEGER;
VAR N,i,j:INTEGER;fir,second:byte;
a,m,b:mas;


procedure rand(n:integer; var  a:mas);
var i:integer;
begin

WRITELN('Random array');
FOR I:=1 TO N DO
 begin
 a[i]:=random(d);
 write(a[i],' ');
 end;
  writeln;
 end;

procedure  Sam(n:integer;  a:mas );
begin
WRITELN('User array');
FOR I:=1 TO N DO
 begin
 write('a[',i,'] = ');
 readln(a[i]);
 end;
 end;

procedure second_menu;
begin
writeln;
writeln('1:bubbles_sort');
writeln('2:select_sort');
writeln('3:binary');

end;

procedure Puzir(n:integer; var  a:mas);
VAR I,J,X:INTEGER;
    sr,per:longint;
    hour,minut,sec,sec100:word;
    t,t0,t1:real;
begin
b:=a;
sr:=0; per:=0;
gettime(hour,minut,sec,sec100);
    t0:=sec+sec100*0.01;
FOR I:=1 TO N DO
  FOR J:=1 TO N-i DO begin
 if a[j]>a[j+1]then
  BEGIN
  inc(sr);
  inc(per);
  x:=a[j];
  a[j]:=a[j+1];
  a[j+1]:=x;
  END;
  for I:=1 to n do
  write(a[i],' ');
  writeln
END;
gettime(hour,minut,sec,sec100);
        t1:=sec+sec100*0.01;
        t:=t1-t0;
    WRITELN('Result:');
    writeln('Perest ',per);
    writeln('Srav  ',sr);
writeln('time  ',t:0:3);
a:=b;
end;

procedure Priamoi_vibor(n:integer; var  a:mas);
VAR I,J,R,X:INTEGER;
 hour,minut,sec,sec100:word;
    t,t0,t1:real;
sr,per:longint;
begin
b:=a;
sr:=0; per:=0;
gettime(hour,minut,sec,sec100);
    t0:=sec+sec100*0.01;
FOR I:=1 TO N-1 DO BEGIN
R:=I;
X:=A[I];
  FOR J:=I+1 TO N DO IF A[J]<X THEN BEGIN
  inc(sr);
  R:=J;
  X:=A[R]
  END;
  inc(per);
A[R]:=A[I];
A[I]:=X
END;
gettime(hour,minut,sec,sec100);
        t1:=sec+sec100*0.01;
        t:=t1-t0;
         WRITELN('Result:');
writeln('Compile ',sr,' Move ',per);
     writeln('time  ',t:0:3);
     a:=b;
end;


procedure Dvoich(n:integer; var  a:mas);
VAR I,J,M,L,R,X:INTEGER;
 hour,minut,sec,sec100:word;
    t,t0,t1:real;
sr,per:longint;
BEGIN
b:=a;
gettime(hour,minut,sec,sec100);
    t0:=sec+sec100*0.01;
sr:=0; per:=0;
 FOR I:=2 TO N DO BEGIN
  X:=A[I];L:=1;R:=I;
  WHILE L<R DO BEGIN

   M:=(L+R) DIV 2;
   begin
   inc(sr);
   per:=per+1;
IF A[M]<=X THEN
L:=M+1
 ELSE R:=M
 end;
END;
  FOR J:=I DOWNTO R+1 DO
  begin
  per:=per+1;
   A[J]:=A[J-1];
  A[R]:=X;

  end;
 END;
 WRITELN('Result:');
 gettime(hour,minut,sec,sec100);
        t1:=sec+sec100*0.01;
        t:=t1-t0;
  writeln('Perest ',per);
    writeln('Srav  ',sr);
    writeln('time  ',t:0:3);
    a:=b;
END;
{-----------------------------------------------------------------------------}
{Выбор необходимой сортировки}
procedure select( a:mas);
var second:byte;
 begin
         second_menu;
         write('Your choice ');
         readln(second);
         writeln;
         case second of
         1:Puzir(n,a);
         2:Priamoi_vibor(n,a);
         3:Dvoich(n,a);
         end;
         end;

{-----------------------------------------------------------------------------}
{Вывод}
procedure answer(n:integer; a:mas);
var
i,s:integer;
begin
writeln('Select writing answer');
writeln('1-Vozrastanie');
writeln('2-Ubivanie');
readln(s);
if s=1 then
         FOR I:=1 TO N DO
begin
WRITE(A[I],' ');
end;
if s=2 then
         FOR I:=n downTO 1 DO
begin
WRITE(A[I],' ');
end;
end;
{-----------------------}
 procedure all_sorts;
 begin
 writeln('Bubbles');
 Puzir(n,m);
 writeln('Select');
 Priamoi_vibor(n,m);
 writeln('Binary');
 Dvoich(n,m);
 end;

{------------------------------------------------------------------------------}

{Основная программа}
  BEGIN
  clrscr;
WRITELN('Enter size array(1..10000)');
READ(N);
writeln('1 - for random numbers');
writeln('2 - for user numbers');
writeln('Your_choice ');
readln(fir);
case fir of
1:rand(n,m);
2:Sam(n,m);
end;
writeln;
writeln('second_choice ');
readln(second);
if second=1 then
begin
select(m);
answer(n,m);
end;
if second=2 then
begin
all_sorts;
end;
readln;
END.
lialia вне форума Ответить с цитированием
Старый 31.03.2013, 17:09   #4
Wadduh
Пользователь
 
Аватар для Wadduh
 
Регистрация: 26.03.2013
Сообщений: 16
По умолчанию

А как в процедуре puzir счетчик I, может использоваться в двух циклах одновременно? Может в этом проблема?
Wadduh вне форума Ответить с цитированием
Старый 31.03.2013, 19:12   #5
lialia
Форумчанин
 
Регистрация: 08.12.2012
Сообщений: 116
По умолчанию

Так?
Код:
procedure Puzir(n:integer; var  a:mas);
VAR I,s,J,X:INTEGER;
    sr,per:longint;
    hour,minut,sec,sec100:word;
    t,t0,t1:real;
begin
b:=a;
sr:=0; per:=0;
gettime(hour,minut,sec,sec100);
    t0:=sec+sec100*0.01;
FOR I:=1 TO N DO
  FOR J:=1 TO N-i DO begin
 if a[j]>a[j+1]then
  BEGIN
  inc(sr);
  inc(per);
  x:=a[j];
  a[j]:=a[j+1];
  a[j+1]:=x;
  END;
  for s:=1 to n do
  write(a[s],' ');
  writeln
END;
gettime(hour,minut,sec,sec100);
        t1:=sec+sec100*0.01;
        t:=t1-t0;
    WRITELN('Result:');
    writeln('Perest ',per);
    writeln('Srav  ',sr);
writeln('time  ',t:0:3);
a:=b;
end;
lialia вне форума Ответить с цитированием
Старый 31.03.2013, 19:50   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Честно говоря, ненавижу разбираться в чужом коде.
Такое общее замечание - при передаче массива через var параметр, он передается по адресу, то есть после первой сортировки он УЖЕ будет отсортирован, и остальные сортировки не будут ничего сортировать.

Снимаю свое замечание - не заметил присваивания массивов (хотя легче передать массив по значению, и программа за нас сделает копию массива).

Возвращаю замечание Вы делаете присваивание массиву а массива б, тем самым сортируя исходный массив (следующие сортировки получат отсортированный массив).

Пишу замечания по ходу прочтения кода
Сортировка пузырьком:
Код:
 if a[j]>a[j+1]then
  BEGIN
  inc(sr);
Неверно - сравнение происходит в любом случае, а увеличение счетчика сравнений только в случае успешного сравнения (inc(sr) должно быть вне if). Также эта ошибка присутствует в прямом выборе.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 31.03.2013 в 20:02.
BDA вне форума Ответить с цитированием
Старый 31.03.2013, 20:01   #7
Wadduh
Пользователь
 
Аватар для Wadduh
 
Регистрация: 26.03.2013
Сообщений: 16
По умолчанию

А зачем нужен вывод на экран сортируемого массива на каждой этерации цикла сортировки?
Код:
for j:= 1 to n do begin 
    //ваш код...
    for s:=1 to n do
         write(a[s],' ');
         writeln;
end;
Или так задумано?
Дело в том, что эта программа не выводит в конце отсортированный массив ни по одному алгоритму, а конкретно эту процедуру она будет выполнять ооочень(бесконечно) долго..
Почему так? Это уже вам виднее, ведь вы писали код..
Мой совет..внимательно пересмотрите алгоритм работы всей программы. т е что зачем и почему делается на каждом этапе ее выполнения.
Если вам нужен готовый код, то попробуйте дать объявление в разделе фриланс))
Wadduh вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировки drobovik Паскаль, Turbo Pascal, PascalABC.NET 2 19.01.2013 23:55
Сравнить эффективность алгоритмов шейкерной сортировки и сортировки слиянием (язык C) Ольга210993 Помощь студентам 2 20.09.2012 13:52
Алгоритмы сортировки пирамидальный(кучей) и быстрой сортировки (с++) mmd12 Помощь студентам 4 17.05.2012 14:14
сортировки Christi93 Общие вопросы C/C++ 2 19.12.2010 12:15