Сортировка методом Хоара - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Здравствуйте , прошу помочь разобраться с сортировкой хоара. вот код из книги ( а не из инета с характерными опечатками в коде , из-за которого ломаешь голову (наболело ж) ) ) . выдает ошибку - переполнения стека (stack overflow )
вот , пока не совсем понятно как он сортировать будет скажем массив 10 9 8 7 6 7 8 9 10 . помогите довести до ума , чтобы прога заработала ! буду очень благодарен ) все , пошел, сам подумаю )

Решение задачи: «Сортировка методом Хоара»

textual
Листинг программы
Uses crt;
type
 mas=array[1..100] of integer;
Var n,i:integer;
    mass:mas;
procedure quicks(first,last:integer;var m:mas);
var i,j,c,x,n:integer;
begin
  i:=first;
  j:=last;
  x:=m[(first+last) div 2]; {выбираем серединный эл-нт массива и делим массив пополам}
  repeat
    while m[i]>x do i:=i+1; {считываем всю левую часть до этого элемента}
    while x>m[j] do j:=j-1; {считываем всю правую часть до этого элемента}
    if i<=j then
     begin
       c:=m[i]; {Сортируем элементы массива}
       m[i]:=m[j];
       m[j]:=c;
       i:=i+1;
       j:=i-1;
     end;
   until i>j;
   if first<j then quicks(first,j,m);
   if i<last then quicks(i,last,m);
  end;
begin
clrscr;
 writeln ('vvedite kol-vo el-ov massiva ');
 Readln (n);
 for i:=1 to n do begin
 writeln ('vvedite ' ,i, 'element ');
 readln (mass[i]); end;
 writeln (' icxodnyi massiv ');
 for i:=1 to n do write (mass[i]:4);
 writeln;
 writeln (' COPTUPOBAHHbIi MASSIV ');
 quicks (1,n,mass);
 for i:=1 to n do write (mass[i]:3);
 Readln
end.

Объяснение кода листинга программы

  1. В начале кода подключается библиотека crt, которая является стандартной для языка Turbo Pascal.
  2. Создается тип данных mas, который представляет собой массив целых чисел размером от 1 до 100.
  3. Определяются две переменные n и i типа integer, которые будут использоваться для итерации по массиву.
  4. Создается переменная mass типа mas, которая будет использоваться для хранения отсортированного массива.
  5. Определяется процедура quicks, которая принимает три аргумента: first, last и m - переменные типа integer, которые определяют начальный и конечный индексы диапазона, который нужно отсортировать, а также переменную m типа mas, которая содержит исходный массив.
  6. В процедуре quicks инициализируются две переменные i и j типа integer, которые будут использоваться для сравнения элементов массива. Также инициализируется переменная x типа integer, которая будет использоваться для выбора среднего элемента массива.
  7. Затем начинается цикл repeat, который выполняется до тех пор, пока m[i] больше x или пока i меньше j. Внутри цикла происходит следующее:
    • Если m[i] больше x, то i увеличивается на 1.
    • Если x больше m[j], то j уменьшается на 1.
    • Если i меньше j, то выполняется рекурсивный вызов процедуры quicks с аргументами first, j и m.
    • Если i больше j, то выполняется рекурсивный вызов процедуры quicks с аргументами i, j и m.
  8. После окончания цикла repeat выполняется проверка условий i <= j и first < j. Если эти условия выполняются, то вызывается рекурсивный вызов процедуры quicks с аргументами first, j и m. Если i < last, то вызывается рекурсивный вызов процедуры quicks с аргументами i, last и m.
  9. В конце кода выводится сообщение о введенном количестве элементов в массиве и каждый элемент массива. Затем выводится отсортированный массив.

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы