Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.247.196] |
|
Сообщ.
#1
,
|
|
|
Люди добрые!!! Помогите написать прогу с использованием сортировки: бинарной вставки.
Вот само задание: а) демонстрационный пошаговй режим сортировки; Б) исследовательский режим сортировки. 1. Демонстрационный режим должен выдавать на экран информацию о текущем состоянии массива на каждом шаге: сравниваемые элементы выделять зеленым цветом, если они не являются инверсией и красным, если это инверсия. Результат перестаноки должен быть виден на следующей строке. Справа показано текущее количество сравнений и перестановок. Сравнить полученные результаты с оценками алгоритма. Пример пошагового вывода. Каждая строка печатается по клавише «Пробел». Кол. элементов = 8. Метод: Сортировка линеными вставками. i=1 44 55 12 42 94 18 06 67 - исходный порядок i=1 44 12 42 94 18 06 67 - выбор текущего элемента 55 i=1 44 12 42 94 18 06 67 - сравнение 55 i=1 44 55 12 42 94 18 06 67 - вставка i=2 44 55 42 94 18 06 67 - выбор текущего элемента 12 i=2 44 55 42 94 18 06 67 - сравнение 12 i=2 44 55 42 94 18 06 67 - перемещение 12 i=2 44 55 42 94 18 06 67 - сравнение 12 i=2 44 55 42 94 18 06 67 - перемещение 12 i=2 12 44 55 42 94 18 06 67 - вставка i=2 12 44 55 94 18 06 67 - выбор текущего элемента 42 i=3 12 44 55 94 18 06 67 - сравнение 42 i=3 12 44 55 94 18 06 67 - перемещение 42 i=3 12 44 55 94 18 06 67 - сравнение 42 i=3 12 44 55 94 18 06 67 - перемещение 42 i=3 12 42 44 55 94 18 06 67 - вставка и.т.д. После окончания сортировки напечатать: Кол.сравнений = XXXX. Кол. перестановок = XXXX. 2. Исследовательский режим сортировки должен быть выполнен для следующих размеров тестовых массивов и расчет производить по результатам 100 испытаний для сгенерированных целочисленных массивов (упорядоченных, среднее число инверсий, максимальное число инверсий): Структура интерфейса исследовательского режима. Исходные данные можно задавать в виде констант. Вывод результатов - непрерывный - до окончания или прерывания по ESC. Метод: ХХХХХХХХ ХХХХХХХХ. Кол.элементов = 256 Кол.повторний = 100 Диапазон = 1000 Исходный порядок - Отсортированный(случайный, обратный) Перемешивание = 128 (обмен местами упорядоченных пар = 2) Мин. Средн. Макс. Оценка Сравнений = ХХХХ ХХХХ ХХХХ Перестановок = ХХХХ ХХХХ ХХХХ ХХХХ |
Сообщ.
#2
,
|
|
|
Код в студию. Что у нас не получается? Щас подскажем %)
|
Сообщ.
#3
,
|
|
|
Сообщ.
#4
,
|
|
|
Moisha,
один из вариантов решения задачи ... uses crt; Procedure GetUserInput; Const kbEsc = #27; kbSpace = #32; Var ch: Char; Begin Repeat ch := ReadKey; If ch = kbEsc then begin WriteLn('breaking program'); Halt(100) end; While KeyPressed Do ReadKey Until ch = kbSpace End; Const n = 8; a: Array[1 .. n] Of Integer = (44, 55, 12, 42, 94, 18, 6, 67); Type Index = 0..n; Procedure PrintArray(Const s: String); Var i: Index; Begin TextColor(LightGray); For i := 1 To n Do Write(a[i]:4); WriteLn(s:25); GetUserInput End; (* Global variables *) Var x: integer; cnt_comp, cnt_swap: integer; Type TMask = (mskHidden, mskNormal, mskRed, mskGreen); Const OutputColor: Array[TMask] Of Integer = (Black, LightGray, LightRed, LightGreen); Var show_mask: Array[1 .. n] Of TMask; Procedure ShowByMask(Const s: String; ival: Integer); Var m, k: Index; Begin Writeln('i = ', ival); For k := 1 to n do Begin TextColor( OutputColor[show_mask[k]] ); Write(a[k]:4) End; TextColor(LightGray); WriteLn(s:25); GetUserInput End; Procedure ShowCompare(i, j: Integer); Var m, k: Index; Begin Inc(cnt_comp); for k := 1 to n do show_mask[k] := mskNormal; if a[i] > a[j] then begin show_mask[i] := mskRed; show_mask[j] := mskRed; end else begin show_mask[i] := mskGreen; show_mask[j] := mskGreen; end; ShowByMask('comparison', i) End; (* main sorting procedure ... *) Procedure Binary; Var i, j : Index; l, r, m, k: Integer; Begin cnt_comp := 0; cnt_swap := 0; for i:=2 to n do begin l:=1; r:=i; while l<>r do begin m:=(l+r)div 2; ShowCompare( i, m ); if a[m]>a[i] then l:=m+1 else r:=m; end; k:=r; x:=a[i]; for j:=i downto k+1 do begin a[j]:=a[j-1]; Inc(cnt_swap) end; a[k]:=x; PrintArray('after moving') end; End; Begin ClrScr; PrintArray( 'Initial array' ); Binary; WriteLn( 'Total comparisons: ', cnt_comp ); WriteLn( 'Total movings: ', cnt_swap ); ReadLn End. |
Сообщ.
#5
,
|
|
|
volvo877, Только что попробовал твой вариант. Спасибо большое за помощь. Работает так как мне и нужно. Еще раз спасибо!!!
|