Глава 43 пример 2 (Быстрая сортировка)

Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.

Модераторы: Oleg_D, Модераторы

Глава 43 пример 2 (Быстрая сортировка)

Сообщение Garrus_En » 11.03.2013 22:49:03

Наткнулся на ошибку в коде второго примера.. запуск программы вывел мне странный реультат:
До сортировки:
549
593
716
845
603
858
545
848
424
624

После сортировки:
424
549
545
845
603
858
716
848
593
629


Из примера видно, что элементы попеременно поменялись местами:
2 с 9 , 1 со 2 , 3 с 6

Не пойму отчего так произошло? код переписан из примера полностью.
Garrus_En
незнакомец
 
Сообщения: 9
Зарегистрирован: 11.03.2013 22:38:26

Re: Глава 43 пример 2 (Быстрая сортировка)

Сообщение Oleg_D » 12.03.2013 09:15:35

Garrus_En писал(а):Не пойму отчего так произошло? код переписан из примера полностью.

Выкладывайте свой код, посмотрим. Мой код таков:
Код: Выделить всё
{ P_43_2 - Быстрая сортировка }

const CSize=10;    { размер массива }

type TNumbers = array [1..CSize] of Integer;
var  Arr  : TNumbers;

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

procedure QuickSort(var arg: TNumbers; aL, aR: Integer);
var
    L, R : integer; { левый и правый индексы }
    M, T : Integer; { среднее значение и временное хранилище }
begin
    { Начальные значения левого и правого индексов }
    L:= aL;    R:= aR;
    { Вычисляем среднее значение }
    M:= (arg[L] + arg[(L + R) div 2] + arg[R]) div 3;
    { Цикл встречного движения }
    repeat
      { Пока левый элемент меньше среднего,
        двигаем левый индекс вправо }
      while arg[L] < M do L:=L+1;
      { Пока правый элемент больше среднего,
        двигаем правый индекс влево }
      while arg[R] > M do R:=R-1;
      { После остановки сравниваем индексы }
      if L <= R then begin
        { Если индексы еще не "встретились" }
        if arg[L]>arg[R] then begin
          { и левый элемент оказался больше правого,
            то меняем элементы местами }
          t:= arg[L];  arg[L]:= arg[R]; arg[R]:= t;
        end;
        { Делаем еще шаг навстречу }
        L:=L+1;  R:=R-1;
      end;
    until L > R; { пока индексы не "встретятся" }
    { если левая часть не отсортирована, то сортируем ее }
    if R > aL then QuickSort(arg, aL, R);
    { если правая часть не отсортирована, то ее тоже сортируем }
    if L < aR then QuickSort(arg, L, aR);
    { выход после сортировки обеих частей }
end;

{ Процедура распечатки массива }

procedure ShowArray(const arg: string);
var i: integer;
begin
  Writeln(arg);
  for i:=1 to CSize do Writeln(Arr[i]);
  Readln;
end;

var i: integer;

begin
  { Заполняем массив случайными числами }
  Randomize;
  for i:=1 to CSize do Arr[i]:=1+Random(1000);
  ShowArray('До сортировки:');
  QuickSort(Arr, 1, CSize);
  ShowArray('После сортировки:');
end.

Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Глава 43 пример 2 (Быстрая сортировка)

Сообщение Garrus_En » 12.03.2013 09:43:08

один в один.. сидел просматривал... символ к символу... почти ( ещё строку randomize; добавил перед заполнением)
может быть фпс неможет загнать этот цикл сам в себя?? на каком компиляторе проверялось?
Garrus_En
незнакомец
 
Сообщения: 9
Зарегистрирован: 11.03.2013 22:38:26

Re: Глава 43 пример 2 (Быстрая сортировка)

Сообщение Oleg_D » 12.03.2013 09:51:57

Garrus_En писал(а):на каком компиляторе проверялось?

На FP 2.6.0 и на Delphi
А вы не глазами проверяйте, к копи-пастом на форум выкладывайте.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Глава 43 пример 2 (Быстрая сортировка)

Сообщение Garrus_En » 12.03.2013 10:56:06

Код: Выделить всё
        {P_43_2 QuickSort}
const CSize=10;         
type TNumbers = array [1..CSize] of integer;
var
   Arr:TNumbers;
Procedure QuickSort(var arg: TNumbers; aL,aR: integer);
var
        L,R: integer;   
        M,T: integer;   
begin
        L:=aL; R:=aR;
       

        M:=(arg[L]+arg[(L+R)div 2]+arg[R])div 3;
        repeat 
                while arg[L]<M do L:=L+1;
                while arg[R]>M do R:=R-1;
                if L <= R then begin
                if arg[L]>arg[R] then begin
            t:=arg[L]; arg[L]:= arg[R]; arg[R]:=t;
                        end;
                        L:=L+1; R:=R-1;
                end;
        until L>R;     
        if R>aL then quickSort(arg,aL,R);
        if L>aR then QuickSort(arg,L,aR);
        end;
        procedure ShowArray(const arg:string);
var i:integer;
begin
        Writeln(Arg);
        for i:=1 to CSize do Writeln(arr[i]);
        Readln;
end;
var i: integer;
begin           
        randomize;
        for i:=1 to CSize do Arr[i]:=1+random(1000);
        ShowArray('До сортировки:');
        QuickSort(Arr,1,CSize);
        ShowArray('После сортировки:');
end.


вот он
Garrus_En
незнакомец
 
Сообщения: 9
Зарегистрирован: 11.03.2013 22:38:26

Re: Глава 43 пример 2 (Быстрая сортировка)

Сообщение Oleg_D » 12.03.2013 11:36:06

Надо так:

if L < aR then QuickSort(arg, L, aR);

У вас так (больше вместо меньше):

if L > aR then QuickSort(arg,L,aR);

И старайтесь форматировать текст аккуратней, для сдвига блоков предварительно выделенного текста очень удобны комбинации клавиш:
Ctrl+K+I -- сдвиг блока вправо
Ctrl+K+U -- сдвиг блока влево
Ctrl+K+H -- отмена выделения блока
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Глава 43 пример 2 (Быстрая сортировка)

Сообщение Garrus_En » 12.03.2013 20:25:04

Спасибо :D
Garrus_En
незнакомец
 
Сообщения: 9
Зарегистрирован: 11.03.2013 22:38:26


Вернуться в Книга "Песни о Паскале"

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

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

Рейтинг@Mail.ru