Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.
Модераторы: Oleg_D, Модераторы
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
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
Garrus_En » 12.03.2013 09:43:08
один в один.. сидел просматривал... символ к символу... почти ( ещё строку randomize; добавил перед заполнением)
может быть фпс неможет загнать этот цикл сам в себя?? на каком компиляторе проверялось?
-
Garrus_En
- незнакомец
-
- Сообщения: 9
- Зарегистрирован: 11.03.2013 22:38:26
Oleg_D » 12.03.2013 09:51:57
Garrus_En писал(а):на каком компиляторе проверялось?
На FP 2.6.0 и на Delphi
А вы не глазами проверяйте, к копи-пастом на форум выкладывайте.
-
Oleg_D
- постоялец
-
- Сообщения: 391
- Зарегистрирован: 09.05.2011 11:28:36
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
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
Garrus_En » 12.03.2013 20:25:04
Спасибо
-
Garrus_En
- незнакомец
-
- Сообщения: 9
- Зарегистрирован: 11.03.2013 22:38:26
Вернуться в Книга "Песни о Паскале"
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4