На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Сортировка бинарной сортировкой массива , Демонстрация бинарной сортировки
    Люди добрые!!! Помогите написать прогу с использованием сортировки: бинарной вставки.
    Вот само задание: а) демонстрационный пошаговй режим сортировки;
    Б) исследовательский режим сортировки.

    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)
    Мин. Средн. Макс. Оценка
    Сравнений = ХХХХ ХХХХ ХХХХ
    Перестановок = ХХХХ ХХХХ ХХХХ ХХХХ
    :wall:
      Код в студию. Что у нас не получается? Щас подскажем %)
          Moisha,
          один из вариантов решения задачи ...

          ExpandedWrap disabled
             
            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.
            volvo877, Только что попробовал твой вариант. Спасибо большое за помощь. Работает так как мне и нужно. Еще раз спасибо!!! :)
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0312 ]   [ 15 queries used ]   [ Generated: 4.02.23, 23:03 GMT ]