Сортировка методом Хоара - 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.
Объяснение кода листинга программы
- В начале кода подключается библиотека crt, которая является стандартной для языка Turbo Pascal.
- Создается тип данных mas, который представляет собой массив целых чисел размером от 1 до 100.
- Определяются две переменные n и i типа integer, которые будут использоваться для итерации по массиву.
- Создается переменная mass типа mas, которая будет использоваться для хранения отсортированного массива.
- Определяется процедура quicks, которая принимает три аргумента: first, last и m - переменные типа integer, которые определяют начальный и конечный индексы диапазона, который нужно отсортировать, а также переменную m типа mas, которая содержит исходный массив.
- В процедуре quicks инициализируются две переменные i и j типа integer, которые будут использоваться для сравнения элементов массива. Также инициализируется переменная x типа integer, которая будет использоваться для выбора среднего элемента массива.
- Затем начинается цикл 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.
- После окончания цикла repeat выполняется проверка условий i <= j и first < j. Если эти условия выполняются, то вызывается рекурсивный вызов процедуры quicks с аргументами first, j и m. Если i < last, то вызывается рекурсивный вызов процедуры quicks с аргументами i, last и m.
- В конце кода выводится сообщение о введенном количестве элементов в массиве и каждый элемент массива. Затем выводится отсортированный массив.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д