Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с QuickSort
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
RathaR
Проблема в следующем: при выполнении у меня "быстрая сортировка" виснет... из ниоткуда параметр І приобретает заоблачные значения. Ошибку найти никак немогу...

program quicksort;
var
F2:text;
I:integer;
M1:array[1..10] of integer;
procedure Sort(A,B:integer);
var I,J,X,P:integer;
begin
Repeat
I:=A; J:=B;
X:=M1[(B+1)div 2];
if M1[I]<X then inc(I); {Вот здесь І приобретает нереальные значения}
if M1[J]>X then dec(J);
If I<=J then begin
P:=M1[I];
M1[I]:=M1[J];
M1[J]:=P;
inc(I); dec(J);
end;
Until I>J;

If A<J then Sort(A,J);
If I<B then Sort(I,B);
end;
begin
Assign(F2,'Sort.sol');
rewrite(F2);
randomize;
For I:=1 to 10 do
M1[I]:=random(100);
Sort(1,10);
For I:=1 to 10 do write(F2,M1[I]);
close(F2);
end.


Выполнял на TDE и Borland Pascal
Помогите разобратся rolleyes.gif
volvo
1)
Цитата
  if M1[I]<X then inc(I);
if M1[J]>X then dec(J);
- это неправильно, там должно быть не однократное увеличение/уменьшение индекса, а увеличение/уменьшение "до тех пор, пока"...
2)
Цитата
X:=M1[(B+1)div 2];
это тоже неправильно... Откуда взялась 1-ца?
RathaR
Цитата(volvo @ 5.07.2009 12:49) *

1) - это неправильно, там должно быть не однократное увеличение/уменьшение индекса, а увеличение/уменьшение "до тех пор, пока"...
2)это тоже неправильно... Откуда взялась 1-ца?


1) эм... да, тут промах, но условный оператор появился от отчаяния, сначала были

While M1[I] < X Do Inc(i);
While M1[J] > x Do Dec(j);


и результат тотже
2) насколько я понял ведь всерамно откуда брать елемент X главное чтоб не первый и не последний... и единица в принципе там мешать не должна хотя возможно особого смысла в ней нет.
volvo
Там должна быть НЕ единица...
 X:=M1[(A+B)div 2];
отрабатывает прекрасно...
Цитата
главное чтоб не первый и не последний
Вот именно... А у тебя это какой будет, скажем, после 5-ой итерации? Даже не то что первым, а ПЕРЕД первым. Ситуация: A = 7, B = 10... Что будет в твоем случае?

Добавлено через 2 мин.
P.S. Ты при выводе данных в файл их хоть пробелами разделяй, а то потом не разберешь, что где...
RathaR
Цитата(volvo @ 5.07.2009 13:07) *

Там должна быть НЕ единица...
 X:=M1[(A+B)div 2];
отрабатывает прекрасно...
Вот именно... А у тебя это какой будет, скажем, после 5-ой итерации? Даже не то что первым, а ПЕРЕД первым. Ситуация: A = 7, B = 10... Что будет в твоем случае?

так как у меня, будет только на первых проходах работать, а когда пойдет по рекурсии.... вот блин, всё проще чем казалось smile.gif
Спасиба большое, ато час сидел розобратся не мог rolleyes.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.