1.8.2. Директива #define

Директива #define служит для замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами. Идентификаторы, заменяющие текстовые или числовые константы, называют именованными константами. Идентификаторы, заменяющие фрагменты программ, называют макроопределениями, причем макроопределения могут иметь аргументы.

Директива #define имеет две синтаксические формы:

       #define  идентификатор текст
       #define  идентификатор (список параметров) текст

Эта директива заменяет все последующие вхождения идентификатора на текст. Такой процесс называется макроподстановкой. Текст может представлять собой любой фрагмент программы на СИ, а также может и отсутствовать. В последнем случае все экземпляры идентификатора удаляются из программы.

Пример:

      #define WIDTH 80
      #define LENGTH (WIDTH+10)

Эти директивы изменят в тексте программы каждое слово WIDTH на число 80, а каждое слово LENGTH на выражение (80+10) вместе с окружающими его скобками.

Скобки, содержащиеся в макроопределении, позволяют избежать недоразумений, связанных с порядком вычисления операций. Например, при отсутствии скобок выражение t=LENGTH*7 будет преобразовано в выражение t=80+10*7, а не в выражение t=(80+10)*7, как это получается при наличии скобок, и в результате получится 780, а не 630.

Во второй синтаксической форме в директиве #define имеется список формальных параметров, который может содержать один или несколько идентификаторов, разделенных запятыми. Формальные параметры в тексте макроопределения отмечают позиции на которые должны быть подставлены фактические аргументы макровызова. Каждый формальный параметр может появиться в тексте макроопределения несколько раз.

При макровызове вслед за идентификатором записывается список фактических аргументов, количество которых должно совпадать с количеством формальных параметров.

     Пример:
     #define  MAX(x,y) ((x)>(y))?(x):(y)
     Эта директива заменит фрагмент
                 t=MAX(i,s[i]);
     на фрагмент
                 t=((i)>(s[i])?(i):(s[i]);

Как и в предыдущем примере, круглые скобки, в которые заключены формальные параметры макроопределения, позволяют избежать ошибок связанных с неправильным порядком выполнения операций, если фактические аргументы являются выражениями.

  Например, при наличии скобок фрагмент
                 t=MAX(i&j,s[i]||j);
  будет заменен на фрагмент
                t=((i&j)>(s[i]||j)?(i&j):(s[i]||j);
  а при отсутствии скобок - на фрагмент
                t=(i&j>s[i]||j)?i&j:s[i]||j;
  в котором условное выражение вычисляется в совершенно другом порядке.

1.8.3. Директива #undef

Директива #undef используется для отмены действия директивы #define. Синтаксис этой директивы следующий #undef идентификатор

Директива отменяет действие текущего определения #define для указанного идентификатора. Не является ошибкой использование директивы #undef для идентификатора, который не был определен директивой #define.

Пример:

       #undef WIDTH
       #undef MAX

Эти директивы отменяют определение именованной константы WIDTH и макроопределения MAX.

2.1.4. Организация двусвязных списков

Связанное хранение линейного списка называется списком с двумя связями или двусвязным списком, если каждый элемент хранения имеет два компонента указателя (ссылки на предыдущий и последующий элементы линейного списка).

В программе двусвязный список можно реализовать с помощью описаний:

     typedef struct ndd
        { float val;      /* значение элемента                */
          struct ndd * n; /* указатель на следующий элемент   */
          struct ndd * m; /* указатель на предыдующий элемент */
          } NDD;
     NDD * dl, * p, * r;
При решении конкретных задач могут возникать разные виды связанного
хранения.

Пусть на входе задана последовательность целых чисел B1,B2,...,Bn
 из  интервала от 1 до 9999, и пусть Fi (1 по возрастанию.
Составить  процедуру для формирования Fn в связанном хранении и
 возвращения указателя на  его начало.
При решении задачи в каждый момент времени имеем упорядоченный
 список Fi и  при вводе элемента Bi+1 вставляем его в нужное место
 списка Fi, получая  упорядоченный список Fi+1. Здесь возможны три
варианта: в списке нет элементов;  число вставляется в начало
списка; число вставляется в конец списка. Чтобы  унифицировать
все возможные варианты, начальный список организуем как связанный
 список из двух элементов <0,1000>.

Рассмотрим программу решения поставленной задачи, в которой
указатели dl, r,  p, v имеют следующее значение: dl указывает
начало списка; p, v - два соседних  узла; r фиксирует узел,
содержащий очередное введенное значение in.
     #include
     #include
     typedef struct str1
       { float val;
         struct str1 *n; }  ND;
     main()
      {  ND *arrange(void);
         ND *p;
         p=arrange();
         while(p!=NULL)
           {
            printf("\n %f ",p->val);
            p=p->n;
           }
      }
     ND *arrange() /*   формирование упорядоченного списка */
      {  ND *dl, *r, *p, *v;
         float in=1;
         char *is;
         dl=malloc(sizeof(ND));
         dl->val=0;                  /*  первый элемент     */
         dl->n=r=malloc(sizeof(ND));
         r->val=10000; r->n=NULL;    /*  последний элемент  */
         while(1)
         {
            scanf(" %s",is);
            if(* is=='q') break;
            in=atof(is);
            r=malloc(sizeof(ND));
            r->val=in;
            p=dl;
            v=p->n;
            while(v->valn;
            }
            r->n=v;
            p->n=r;
        }
        return(dl);
      }

2.2.1. Пузырьковая сортировка

Задача сортировки заключается в следующем: задан список целых чисел (простейший случай) В=. Требуется переставить элементы списка В так, чтобы получить упорядоченный список B’=, в котором для любого 1<=i<=n элемент K’(i) <=»K’(i+1).»

При обменной сортировке упорядоченный список В’ получается из В систематическим обменом пары рядом стоящих элементов, не отвечающих требуемому порядку, пока такие пары существуют.

Наиболее простой метод систематического обмена соседних элементов с неправильным порядком при просмотре всего списка слева на право определяет пузырьковую сортировку: максимальные элементы как бы всплывают в конце списка.

Пример:

                 B=<20,-5,10,8,7>,   исходный список;
                 B1=<-5,10,8,7,20>,  первый просмотр;
                 B2=<-5,8,7,10,20>,  второй просмотр;
                 B3=<-5,7,8,10,20>,  третий просмотр.

В последующих примерах будем считать, что сортируется одномерный массив (либо его часть от индекса n до индекса m) в порядке возрастания элементов.

Нижеприведенная функция bubble сортирует входной массив методом пузырьковой сортировки.

     /*   сортировка   пузырьковым   методом           */
     float * bubble(float * a, int m, int n)
     {
     char is=1;
     int i;
     float c;
       while(is)
       {   is=0;
           for (i=m+1; i<=n; i++)
 if ( a[i] < a[i-1] ) { c="a[i];" a[i]="a[i-1];"
a[i-1]="c;" is="1;" } } return(a); }

Пузырьковая сортировка выполняется при количестве действий Q=(n-m)*(n-m) и не требует дополнительной памяти.

Установка параметров публикации

При тестировании фильма, а также при публикации его с помощью команды Publish используются параметры публикации, установленные по умолчанию. Чтобы установить собственные значения этих параметров, следует воспользоваться командой Publish Settings (Параметры публикации) из меню File. Выбор данной команды приводит к открытию диалогового окна, с помощью которого и выполняются требуемые изменения.

В исходном состоянии окно содержит три вкладки:

  • Formats (Форматы) — данная вкладка предназначена для выбора форматов файлов, которые должны быть созданы при публикации фильма; дополнительно вы можете ввести собственное имя для каждого генерируемого файла, сняв флажок Use default names (Использовать имена, установленные по умолчанию); если необходимо, можно указать полный маршрут доступа к файлу, причем для каждого файла свой; при выборе одного из дополнительных форматов в окне Publish Settings создается соответствующая вкладка; если выбран какой-либо графический формат (GIF, JPEG, PNG), то в HTML автоматически будет добавлен соответствующий текст, обеспечивающий при отсутствии Flash-плеера замену фильма графикой;
  • Flash — данная вкладка обеспечивает установку параметров экспорта файла FLA в формат SWF;
  • HTML – элементы этой вкладки обеспечивают выбор некоторых дополнительных параметров размещения фильма на HTML-странице.

Кнопка ОК обеспечивает сохранение установленных параметров без инициализации команды Publish; введенные значения будут использоваться по умолчанию для всех последующих публикаций.

Кнопка Publish, помимо сохранения установленных параметров, инициализирует выполнение команды Publish.

Вкладка Flash содержит следующие элементы:

  • Раскрывающийся список Version позволяет выбирать версию Flash-плеера, для которой должен быть сгенерирован SWF-файл;
  • Раскрывающийся список Load Order (Очередность загрузки), который позволяет выбрать очередность загрузки слоев первого кадра фильма: либо снизу вверх (Bottom up), либо сверху вниз (Top down);
  • Флажок Generate Size Report (Создать отчет о размере); если он установлен, то при публикации фильма создается отчет о размерах кадров фильма; отчет сохраняется в отдельном текстовом файле;

Флажок Omit Trace Actions (Отменить действие Trace); если он установлен, то Flash игнорирует действие Trace, которое используется при отладке сценариев на ActionScript;

  • Флажок Protect from Import (Защитить от импорта); установка флажка препятствует импорту SWF-файла из окна плеера (или броузера) в формат FLA; при установке флажка целесообразно также ввести в текстовом поле Password пароль, позволяющий (как бы) защитить ваш фильм от несанкционированного доступа;
  • Флажок Debugging Permitted (Разрешить отладку); установка флажка активизирует отладчик и разрешает удаленную отладку фильма (то есть после его размещения на Web-сервере); в этом случае вы можете ввести в расположенном ниже текстовом поле Password пароль, чтобы защитить фильм от несанкционированного доступа;
  • Флажок Compress Movie (Сжатие фильма), если установлен, указывает на необходимость включения алгоритма дополнительного сжатия фильма при его экспорте в формат SWF;
  • Ползунковый регулятор JPEG Quality (Качество JPEG-изображе-ния) и связанное с ним текстовое поле обеспечивают выбор приемлемого (на ваш взгляд) качества JPEG-изображений, используемых в фильме;
  • Кнопки Set (Установить) позволяют изменить параметры звукового сопровождения фильма;
  • Флажок Override Sound Settings (Изменять параметры звука), если установлен, разрешает индивидуальную установку параметров для отдельных элементов звукового сопровождения; это позволяет создавать две версии звукового сопровождения: лучшего качества (но большего размера) — для локального использования и более низкого качества — для публикации в Интернете.
  • Вкладка HTML содержит следующие элементы:

  • раскрывающийся список Template (Шаблон) позволяет выбрать тип шаблона, в соответствии с которым будет сгенерирован HTML-документ; список содержит следующие основные варианты (всего их более десятка):

    • Flash Only (Только Flash) – шаблон обеспечивает включение в HTML-документ только тех тэгов, которые необходимы для загрузки фильма (то есть тэгов <OBJECT> и <EMBED>); данный шаблон используется по умолчанию;
    • Flash with Named Anchor (Flash с именованными якорями) -шаблон обеспечивает включение в HTML-документ дополнительных гиперссылок, на основе которых может выполняться навигация между кадрами фильма;
    • Image Map (Сенсорная карта) — шаблон обеспечивает включение в HTML-документ тэга <IMG> с параметрами, позволяющими создавать клиентскую сенсорную карту; при выборе данного шаблона необходимо на вкладке Formats разрешить генерацию файла в одном из графических форматов;
      • Quit Time — шаблон позволяет включить в HTML-документ Flash-фильм в виде проектора в формате Quit Time;
    • раскрывающийся список Dimensions (Размеры) совместно с полями Width и Height позволяет выбрать способ измерения и размеры окна фильма (в данном случае более уместным было бы слово «экран»);
    • флажок Paused at Start (Пауза перед запуском); если он установлен, то фильм после загрузки не воспроизводится, пока пользователь не инициализирует воспроизведение сам; по умолчанию воспроизведение фильма начинается сразу после его загрузки;
    • флажок Loop (Цикл); если установлен, то воспроизведение фильма циклически повторяется, пока страница не будет закрыта;
    • флажок Display Menu (Показывать меню); установка флажка разрешает использование контекстного меню клипа, вызываемого щелчком правой кнопкой мыши;
    • флажок Device Font (Физический шрифт); его установка разрешает применение функции сглаживания (anti-aliasing) к шрифтам, не установленным на компьютере пользователя;
    • раскрывающийся список Window Mode (Режим окна) предназначен для выбора варианта представления содержимого фильма на Web-странице:

      • Window — Flash-плеер использует собственное прямоугольное окно, отображаемое внутри окна броузера; этот вариант обеспечивает наибольшую скорость воспроизведения;
      • Opaque Windowless (Непрозрачный, без окна) — фильм воспроизводится непосредственно на странице, «без экрана», при этом он может заслонять другие объекты страницы;
      • Transparent Windowless (Прозрачный, без окна) — вариант отличается от предыдущего тем, что через фильм «просвечивают» закрытые им другие элементы страницы.

    Чтобы оценить установленные вами параметры публикации, целесообразно воспользоваться командой Publish Prewiev (Предварительный просмотр публикации), входящей в меню File. Данная команда по сути представляет собой заголовок каскадного меню, состав которого изменяется в зависимости от того, какие форматы публикации были установлены на вкладке Formats диалогового окна Publish Settings. Например, если помимо основных форматов (SWF и HTML) были выбраны графические форматы GIF и JPEG, меню будет выглядеть, как показано на рис. 12.7. Если вы выберите вариант GIF, то это приведет к загрузке в броузер фильма в формате GIF.

  • Публикация фильма в дополнительных форматах

    В предыдущем разделе было отмечено, что Flash обеспечивает возможность публикации фильма в одном из графических форматов, поддерживаемых HTML — GIF, JPEG и PNG. Такая возможность полезна в тех случаях, если вы не уверены, что потенциальные посетители вашего сайта располагают Flash-плеером, либо достаточно быстрым соединением с Интернетом.

    Дня любого из указанных форматов вы можете указать требуемые параметры, которые на ваш взгляд в наибольшей степени соответствуют характеру изображения и предполагаемой аудитории. Дня этого необходимо:

    1. Открыть диалоговое окно Publish Settings и перейти на вкладку Formats.

    2. Поставить один или несколько флажков, соответствующих тем форматам, для которых вы хотите изменить параметры публикации; при этом окно Publish Settings будет дополнено новыми вкладками
    3. Перейти на требуемую вкладку и установить параметры публикации.

    В частности, для формата GIF на соответствующей вкладке могут быть заданы:

    • геометрические размеры изображения; они устанавливаются с помощью полей Width Height; если поставить флажок Match Movie, то будут использованы размеры стола фильма;
    • тип изображения (статическое или анимированное); выбор выполняется с помощью пары переключателей Playback; для ани-мированного GIF можно дополнительно определить цикличность воспроизведения:
    • переключатель Loop Continuously означает непрерывное воспроизведение;
    • переключатель Repeat связан с полем times, в котором вводится количество повторений;
      уровень прозрачности изображения; выбирается из раскрывающегося списка Transparent;
    • цветовая палитра; выбор палитры производится с помощью раскрывающегося списка Palette Type; при выборе варианта Custom вы можете указать файл, содержащий используемую палитру.

    На основе любого из графических форматов вы можете создать так называемую карту-изображение (или сенсорную карту) — Image Map. Сенсорные карты на Web-страницах достаточно хорошо зарекомендовали себя как удобное средство навигации по сайту. Для создания сенсорной карты требуется соответствующим образом настроить шаблон публикации.

    Использование шаблонов

    Шаблон представляет собой текстовый файл, который содержит «заготовку» для создания HTML-документа, обеспечивающего загрузку Flash-фильма в окно броузера. От обычного HTML-документа шаблон отличается тем, что в нем используется специальный заголовок и так называемые переменные шаблона. Переменная шаблона – это предопределенная последовательность символов, начинающаяся со знака доллара $, например, $LO.

    При генерации HTML-документа Flash заменяет переменные шаблона значениями параметров, указанных в окне Publish Settings. Если вы достаточно хорошо знаете HTML, то можете открыть файл шаблона в текстовом редакторе (например, в Блокноте) или в HTML-редакторе и скорректировать его таким образом, чтобы получился требуемый HTML-документ. В частности, вы можете добавить в него сценарии на JavaScript или VBScript. Если в шаблоне не останется ни одной переменной, Flash вообще ничего не будет изменять в этом файле.

    Все файлы шаблонов находятся в папке Flash MX\First Run\HTML и имеют расширение html.

    В таблице 12.1 приведены переменные шаблона для некоторых параметров публикации фильма.

    Таблица 12.1 Переменные шаблона для некоторых параметров публикации фильма

    Параметр публикации

    Переменная шаблона

    Заголовок шаблона

    $ТТ

    Начало описания шаблона

    $DS

    Конец описания шаблона

    $DF

    Заголовок HTML-документа

    $TI

    Цвет фона HTML-документа

    $BG

    Ширина окна фильма

    $WI

    Высота окна фильма

    SHE

    Имя файла фильма (.swf)

    $MO

    Список URL фильма

    $MU

    Текст

    $MT

    Параметры для тэга <OBJECT>

    $PO

    Параметры для тэга <EMBED>

    $PE

    Ширина GIF-изображения

    SOW

    Высота GIF-изображения

    $GH

    Ширина JPEG-изображения

    $JW

    Высота JPEG-изображения

    $JH

    Режим окна

    $WM

    Из приведенных в таблице переменных шаблона дополнительного пояснения требуют две — $MU и $МТ.

    Переменная $MU указывает Flash, что необходимо сформировать список URL, используемых в фильме, и поместить его в текст документа в виде комментария. Такой список может оказаться полезным при проверке корректности используемых URL.

    Переменная $МТ указывает Flash, что требуется вставить весь текст из фильма в тело HTML-документа в виде комментария. Это позволит поисковым машинам проиндексировать содержимое фильма и в последующем использовать ключевые слова при поиске.

    2.1.5. Стеки и очереди

    В зависимости от метода доступа к элементам линейного списка различают разновидности линейных списков называемые стеком, очередью и двусторонней очередью.

    Стек – это конечная последовательность некоторых однотипных элементов – скалярных переменных, массивов, структур или объединений, среди которых могут быть и одинаковые. Стек обозначается в виде: S= и представляет динамическую структуру данных; ее количество элементов заранее не указывается и в процессе работы, как правило изменяется. Если в стеке элементов нет, то он называется пустым и обозначается S=<>.

    Допустимыми операциями над стеком являются:

    - проверка стека на пустоту S=<>,

    - добавление нового элемента Sn+1 в конец стека – преобразование < S1,…,Sn> в < S1,…,Sn+1>;

    - изъятие последнего элемента из стека – преобразование < S1,…,Sn-1,Sn> в < S1,…,Sn-1>;

    - доступ к его последнему элементу Sn, если стек не пуст.

    Таким образом, операции добавления и удаления элемента, а также доступа к элементу выполняются только в конце списка. Стек можно представить как стопку книг на столе, где добавление или взятие новой книги возможно только сверху.

    Очередь – это линейный список, где элементы удаляются из начала списка, а добавляются в конце списка (как обыкновенная очередь в магазине).

    Двусторонняя очередь – это линейный список, у которого операции добавления и удаления элементов и доступа к элементам возможны как вначале так и в конце списка. Такую очередь можно представить как последовательность книг стоящих на полке, так что доступ к ним возможен с обоих концов.

    Реализация стеков и очередей в программе может быть выполнена в виде последовательного или связанного хранения. Рассмотрим примеры организации стека этими способами.

    Одной из форм представления выражений является польская инверсная запись, задающая выражение так, что операции в нем записываются в порядке выполнения, а операнды находятся непосредственно перед операцией.

    Например, выражение

                           (6+8)*5-6/2

    в польской инверсной записи имеет вид

                          6 8 + 5 * 6 2 / -

    Особенность такой записи состоит в том, что значение выражения можно вычислить за один просмотр записи слева направо, используя стек, который до этого должен быть пуст. Каждое новое число заносится в стек, а операции выполняются над верхними элементами стека, заменяя эти элементы результатом операции. Для приведенного выражения динамика изменения стека будет иметь вид

             S = <>;  <6>;  <6,8>;  <14>;  <14,5>;  <70>;
                 <70,6>;  <70,6,2>;  <70,3>;  <67>.

    Ниже приведена функция eval, которая вычисляет значение выражения, заданного в массиве m в форме польской инверсной записи, причем m[i]>0 означает неотрицательное число, а значения m[i]<0 операции. В качестве кодировки операций сложения, вычитания, умножения и деления выбраны отрицательные числа 1, 2, 3, 4. Для организации последовательного хранения стека используется внутренний массив stack. Параметрами функции являются входной массив a и его длина l.

     float eval (float *m, int l) { int p,n,i; float stack[50],c;
    for(i=0; i < l ;i++) if ((n=m[i])<0) { c="st[p--];"
     switch(n) { case 1: stack[p]+="c;" break;
     case 2: stack[p]-="c;" break; case 3: stack[p]*="c;" break;
    case 4: stack[p]/="c;" } } else stack[++p]="n;" return(stack[p]); }

    Рассмотрим другую задачу. Пусть требуется ввести некоторую последовательность символов, заканчивающуюся точкой, и напечатать ее в обратном порядке (т.е. если на входе будет «ABcEr-1.» то на выходе должно быть «1-rEcBA»). Представленная ниже программа сначала вводит все символы последовательности, записывая их в стек, а затем содержимое стека печатается в обратном порядке. Это основная особенность стека – чем позже элемент занесен в стек, тем раньше он будет извлечен из стека. Реализация стека выполнена в связанном хранении при помощи указателей p и q на тип, именованный именем STACK.

      #include
      typedef struct st           /* объявление типа STACK */
        { char ch;
          struct st *ps;   } STACK;
      main()
      {   STACK *p,*q;
          char a;
          p=NULL;
          do                      /*  заполнение стека    */
          { a=getch();
            q=malloc(sizeof(STR1));
             q->ps=p; p=q;
             q->ch=a;
          }  while(a!='.');
          do                      /*  печать стека        */
          { p=q->ps;free(q);q=p;
            printf("%c",p->ch);
          } while(p->ps!=NULL);
      }

    2.2.2. Сортировка вставкой

    Упорядоченный массив B’ получается из В следующим образом: сначала он состоит из единственного элемента К1; далее для i=2,…,N выполняется вставка узла Кi в B’ так, что B’ остается упорядоченным списком длины i.

    Например, для начального списка B=<20,-5,10,8,7> имеем:

                B=<20,-5,10,8,7>  B'=<>
                B=<-5,10,8,7>    B'=<20>
                B=<10,8,7>       B'=<-5,20>
                B=<8,7>         B'=<-5,10,20>
                B=<7>            B'=<-5,8,10,20>
                B=<>              B'=<-5,7,8,10,20>

    Функция insert реализует сортировку вставкой.

          /*    сортировка  методом   вставки              */
          float *insert(float *s, int m, int n)
          {
          int i,j,k;
          float aux;
          for (i=m+1; i<=n; i++) { aux="s[i];"
    for (k="m;" k<="i" && s[k]=k; j--)  s[j+1]=s[j];
                 s[k]=aux;
               }
               return(a);
          }

    Здесь оба списка В и В’ размещаются в массиве s, причем список В занимает часть s c индексами от i до n, а B’ – часть s c индексами от m до i-1 .

    При сортировке вставкой требуется Q=(n-m)*(n-m) сравнений и не требуется дополнительной памяти.

    2.2.3. Сортировка посредством выбора

    Упорядоченный список В’ получается из В многократным применением выборки из В минимального элемента, удалением этого элемента из В и добавлением его в конец списка В’, который первоначально должен быть пустым.

    Например:

                B=<20,10,8,-5,7>, B'=<>
                B=<20,10,8,7>,    B'=<-5>
                B=<20,10,8>,      B'=<-5,7>
                B=<20,10>,        B'=<-5,7,8>
                B=<20>,           B'=<-5,7,8,10>
                B=<>,            B'=<-5,7,8,10,20> .

    Функция select упорядочивает массив s сортировкой посредством выбора.

          /*    сортировка  методом  выбора          */
          double *select( double *s, int m, int n)
          {
            int i,j;
            double c;
            for (i=m; is[j])
                 {  c=s[i];
                    s[i]=s[j];
                    s[j]=c;
                 }
            return(s);
          }

    Здесь, как и в предыдущем примере оба списка В и В’ размещаются в разных частях массива s . При сортировке посредством выбора требуется Q=(n-m)*(n-m) действий и не требуется дополнительной памяти.

    Сортировка квадратичной выборкой. Исходный список В из N элементов делится на М подсписков В1,В2,…,Вm, где М равно квадратному корню из N, и в каждом В1 находится минимальный элемент G1. Наименьший элемент всего списка В определяется как минимальный элемент Gj в списке , и выбранный элемент Gj заменяется новым наименьшим из списка Bj. Количество действий, требуемое для сортировки квадратичной выборкой, несколько меньше, чем в предыдущих методах Q= N*N, но требуется дополнительная память для хранения списка G.