Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Быстрая сортировка

64K
25 марта 2011 года
сван
8 / / 08.01.2011
Помогите найти ошибку. Сортировка реализована с помощью указателей. Малое количество элементов сортирует, а большее нет(
Код:
uses crt;
const m=5;n=15;
type
plist=^list;
list=record
chislo:integer;
nom_seans:integer;
time_beg:string;
rayd:integer;
mesto:integer;
cena:integer;
next:plist;
end;
stack=record;
t,r:integer;
end;
var
  head,q,p,rt,rr,mm:plist;
l,i,j,x:integer;
f,f1,f2:text;
str,str2,red2:string;
a,fil:boolean;
t,r,ww,pp,ll,xx,ln:integer;
s:0..m;
st:array[1..m] of stack;
begin
clrscr;

new(p);
p^.next:=nil;
readln(p^.chislo);
head:=p;

for i:=2 to n do
 begin
  new(q);
  q^.next:=nil;
  readln(q^.chislo);
  p^.next:=q;
  p:=p^.next;
 end;
 
pp:=1;
s:=1; st.t:=1; st.r:=n; l:=1;
repeat
 t:=st.t; r:=st.r; s:=s-1;
  repeat
    i:=t; j:=r; x:=(l+r) div 2;
    p:=head;pp:=1;
      while (pp<>x) do
        begin
          p:=p^.next;
          pp:=pp+1;
        end;
          pp:=1;
            q:=head;
              while (pp<>i) do
                begin
                q:=q^.next;
                pp:=pp+1;
                end;
              pp:=1; mm:=head;
            while (pp<>j) do
            begin
              mm:=mm^.next;
              pp:=pp+1;
            end;

      repeat

      while q^.chislo<p^.chislo do
      begin
      i:=i+1;
      q:=q^.next;
      end;

      while p^.chislo<mm^.chislo do
      begin
      j:=j-1;
      rr:=head;
      while (rr^.next<>mm) do
      rr:=rr^.next;
      mm:=rr;
      end;

      if i<=j then
       begin
       ln:=ln+1;
        ww:=q^.chislo;
        q^.chislo:=mm^.chislo;
        mm^.chislo:=ww;
        i:=i+1;
        j:=j-1;
       end;
       pp:=1;

            q:=head;
              while (pp<>i) do
                begin
                q:=q^.next;
                pp:=pp+1;
                end;
              pp:=1; mm:=head;
            while (pp<j) do
            begin
              mm:=mm^.next;
              pp:=pp+1;
            end;
        rt:=head;
  while (rt<>nil) do
 begin
  write(rt^.chislo,' ');
  rt:=rt^.next;
 end;
 writeln;
      until i>j;

      if i<r then
      begin
      s:=s+1;
      st.t:=i;
      st.r:=r;
      end;
     r:=j;
   until t>=r;
   l:=l+1;
  until s=0;

  p:=head;
  while (p<>nil) do
 begin
  write(p^.chislo,' ');
  p:=p^.next;
 end;
  end.
1.8K
26 марта 2011 года
LM(AL/M)
332 / / 20.12.2005
а где тут по твоему процедура сортировки?
64K
26 марта 2011 года
сван
8 / / 08.01.2011
Тут нет процедуры, мне просто нужно разобраться как делается сортировка с указателями, а сама сортировка вот:
Код:
pp:=1;
s:=1; st.t:=1; st.r:=n; l:=1;
repeat
 t:=st.t; r:=st.r; s:=s-1;
  repeat
    i:=t; j:=r; x:=(l+r) div 2;
    p:=head;pp:=1;
      while (pp<>x) do
        begin
          p:=p^.next;
          pp:=pp+1;
        end;
          pp:=1;
            q:=head;
              while (pp<>i) do
                begin
                q:=q^.next;
                pp:=pp+1;
                end;
              pp:=1; mm:=head;
            while (pp<>j) do
            begin
              mm:=mm^.next;
              pp:=pp+1;
            end;

      repeat

      while q^.chislo<p^.chislo do
      begin
      i:=i+1;
      q:=q^.next;
      end;

      while p^.chislo<mm^.chislo do
      begin
      j:=j-1;
      rr:=head;
      while (rr^.next<>mm) do
      rr:=rr^.next;
      mm:=rr;
      end;

      if i<=j then
       begin
       ln:=ln+1;
        ww:=q^.chislo;
        q^.chislo:=mm^.chislo;
        mm^.chislo:=ww;
        i:=i+1;
        j:=j-1;
       end;
       pp:=1;

            q:=head;
              while (pp<>i) do
                begin
                q:=q^.next;
                pp:=pp+1;
                end;
              pp:=1; mm:=head;
            while (pp<j) do
            begin
              mm:=mm^.next;
              pp:=pp+1;
            end;
        rt:=head;
  while (rt<>nil) do
 begin
  write(rt^.chislo,' ');
  rt:=rt^.next;
 end;
 writeln;
      until i>j;

      if i<r then
      begin
      s:=s+1;
      st.t:=i;
      st.r:=r;
      end;
     r:=j;
   until t>=r;
   l:=l+1;
  until s=0;


Я сделала эту сортировку с массивом, всё точно также, и работает... А тут что то сбивается(
1.8K
26 марта 2011 года
LM(AL/M)
332 / / 20.12.2005
осталось лишь найти 10 отличий...
64K
26 марта 2011 года
сван
8 / / 08.01.2011
То, код ранее это сама сортировка, а первый код это готовая прога... Она рабочая. Просто я не могу найти ошибку... Я понимаю, что код грамозкий и не хочется с ним возиться, хотя бы просто протестируйте его. Могит с вашим опытом вам с разу будет видна ошибка...
1.8K
26 марта 2011 года
LM(AL/M)
332 / / 20.12.2005
выбросьте эту идею из головы. Копание в таком коде никому не будет полезно. Разбейте прогу на процедуры и тестируйте их по отдельности (желательно автоматически) -- это будет надежнее и быстрее, и может даже получите удовольствие от процесса
1
27 марта 2011 года
kot_
7.3K / / 20.01.2000
Я напоминаю что во первых для выражения благодарности используется репутация (по просьбе мировой закулисы, заместо весов теперь используется шестиконечная звезда :) ). Во вторых - за подобные портянки кода из разряда найди "1000 и одно отличие" я буду выдавать нарушение как за спам.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог