Сортировка массива с методом прямого включения. Метод вставки с бинарным включением

Такой метод широко используется при игре в карты. Элементы (карты) мысленно делятся на уже “готовую” последовательность A1 … An и исходную последовательность Ai … An. При каждом шаге, начиная с i=2 и увеличивая I каждый раз на единицу, из исходной последовательности извлекается i-й элемент и перекладывается в готовую последовательность, при этом он вставляется в нужное место.

Выше показан в качестве примера процесс сортировки с помощью включения восьми случайно выбранных чисел:Алгоритм этой сортировки таков:

FOR i:=2 ТО n DО

включение х на соответствующее место среди а ... a[j];

В реальном процессе поиска подходящего места удобно, чередуя сравнения и движения по последовательности, как бы просеивать Х, т. е. Х сравнивается с очередным элементом aj, а затем либо Х вставляется на свободное место, либо aj сдвигается (передается)вправо, и процесс "уходит" влево. Обратите внимание, что процесс просеивания может закончиться при выполнении одного из, двух следующих различных условий:

1. Найден элемент aj с ключом, меньшим чем ключ у Х.

2. Достигнут левый конец готовой последовательности.

Такой типичный случай повторяющегося процесса с двумя условиями окончания позволяет нам воспользоваться хорошо известным приемом барьера (sentinel). Здесь его легко применить, поставив барьер a0 со значением Х. (Заметим, что для этого необходимо расширить диапазон индекса в описании переменной а до 0 ... n.)

Анализ метода.прямого включения. Число сравнений ключей (Ci) при i-ом просеивании самое большее равно i - 1,самое меньшее – 1; если предположить, что все перестановки из п ключей равновероятны, то среднее число сравнений - i/2. Число, же пересылок (присваиваний элементов) Mi равно Ci + 2 (включая барьер). Поэтому общее число сравнений и число пересылок таковы:

Сave = (n2 + n - 2)/4,

Сmax = (n2 + n - 4)/4,

М min = З*(n - 1),

М ave = (n2 + 9n - 10)/4,

М max = (n2 + 3n - 4)/2.

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

Алгоритм с прямыми включениями можно легко улучшить, если обратить внимание на то, что готовая последовательность (a1 … ai-1 , в которую надо вставить новый элемент, сама уже упорядочена. Естественно остановиться на двоичном поиске, при котором делается попытка сравнения с серединой готовой последовательности, а затем процесс деления пополам идет до тех пор, пока не будет найдена точка включения. Такой модифицированный алгоритм сортировки называется методом с двоичным включением (binary insertion).

Сортировка методом прямого включения, так же, как и сортировка методом простого выбора, обычно применяется для массивов, не содержащих повторяющихся элементов.

Сортировка этим методом производится последовательно шаг за шагом. На k –м шаге считается, что часть массива, содержащая первые k– 1 элемент, уже упорядочена, то есть .

Далее необходимо взять k –й элемент и подобрать для него место в отсортированной части массива такое, чтобы после его вставки упорядоченность не нарушилась, то есть надо найти такое что . Затем надо вставить элемент a(k) на найденное место.

С каждым шагом отсортированная часть массива увеличивается. Для выполнения полной сортировки потребуется выполнить n– 1 шаг.

Осталось ответить на вопрос, как осуществить поиск подходящего места для элемента х . Поступим следующим образом: будем просматривать элементы, расположенные левее х (то есть те, которые уже упорядочены), двигаясь к началу массива. Нужно просматривать элементы а(j) , j изменяется от k– l до 1. Такой просмотр закончится при выполнении одного из следующих условий:

Найден элемент , что говорит о необходимости вставки х между и а(j) .

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

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

Методику сортировки иллюстрирует таблица 2:

Таблица 2 – Пример сортировки с помощью прямого включения

Первоначально упорядоченная последовательность состоит из 1–го элемента 9. Элемент а( 2) =5 – первый из неупорядоченной последовательности и 5 < 9, поэтому ставится на его место, а 9 сдвигается вправо. Теперь упорядоченная последовательность состоит из двух элементов 5, 9. Элемент а( 3) =15 неупорядоченной последовательности больше всех элементов упорядоченной последовательности, поэтому остаётся на своём месте и на следующем шаге упорядоченная последовательность состоит из 5, 9, 15, а рассматриваемый элемент 6. Процесс происходит до тех пор, пока последовательность не станет упорядоченной.

Шейкерная сортировка

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

На этих наблюдениях основан метод шейкерной сортировки (ShakerSort). При его применении на каждом следующем шаге меняется направление последовательного просмотра. В результате на одном шаге "всплывает" очередной наиболее легкий элемент, а на другом "тонет" очередной самый тяжелый. Пример шейкерной сортировки приведен в таблице 3.

Таблица 3 – Пример шейкерной сортировки

Сортировка массива с помощью включений с уменьшающимися расстояниями (метод Шелла)

Д. Шеллом было предложено усовершенствование сортировки с помощью прямого включения.

Идея метода: все элементы массива разбиваются на группы таким образом, что в каждую группу входят элементы, отстоящие друг от друга на некоторое число позиций L . Элементы каждой группы сортируются. После этого все элементы вновь объединяются и сортируются в группах, при этом расстояние между элементами уменьшается. Процесс заканчивается после того, как будет проведено упорядочивание элементов с расстоянием между ними, равным 1.

Пример сортировки методом Шелла приведен в таблице 4.

Таблица 4 – Пример сортировки методом Шелла

Сначала рассмотрим вариант, когда первоначальное значение L равно половине числа элементов в массиве, а каждое последующее значение вдвое меньше предыдущего. Заметим, что обмениваются элементы, которые отстоят на величину шага. Если при сравнении 2–х элементов обмена не произошло, то места сравниваемых элементов сдвигаются вправо на одну позицию. Если обмен произошёл, то происходит сдвиг соответствующих сравниваемых элементов на L .

Сортировка разделением (быстрая сортировка)

Метод сортировки разделением был предложен Чарльзом Хоаром. Этот метод является развитием метода простого обмена и настолько эффективен, что его стали называть методом быстрой сортировки – «Quicksort».

Основная идея алгоритма состоит в том, что случайным образом выбирается некоторый элемент массива x , после чего массив просматривается слева, пока не встретится элемент a(i) такой, что a(i) > x , а затем массив просматривается справа, пока не встретится элемент a(i) такой, что a(i) < x . Эти два элемента меняются местами, и процесс просмотра, сравнения и обмена продолжается, пока мы не дойдем до элемента x . В результате массив окажется разбитым на две части – левую, в которой значения ключей будут меньше x , и правую со значениями ключей, большими x . Далее процесс рекурсивно продолжается для левой и правой частей массива до тех пор, пока каждая часть не будет содержать в точности один элемент. Рекурсию можно заменить итерациями, если запоминать соответствующие индексы массива.

Процесс сортировки массива быстрым методом представлен в таблице 5.

Таблица 5 – Пример быстрой сортировки

Метод: Метод косвенного измерения влажности веществ, основанный на зависимости диэлектрической проницаемости этих веществ от их влажности. Источник: РМГ 75 2004: Государственная система обеспечения еди …

КРОВЬ - КРОВЬ, жидкость, заполняющая артерии, вены и капиляры организма и состоящая из прозрачной бледножелтоват. цвета плаз мы и взвешенных в ней форменных элементов: красных кровяных телец, или эритроцитов, белых, или лейкоцитов, и кровяных бляшек, или … Большая медицинская энциклопедия

Недвижимость - (Real estate) Определение недвижимости, виды недвижимости, аренда и продажа недвижимости Информация о понятии недвижимость, виды недвижимости, аренда и продажа недвижимости, налогообложение и страхование Содержание - это вид имущества,… … Энциклопедия инвестора

У этого термина существуют и другие значения, см. C. См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в … Википедия

ОЦЕНКА СТОИМОСТИ НЕМАТЕРИАЛЬНЫХ АКТИВОВ - (англ. intangible assets appraisal) – определение стоимости объема прав предприятия на определенную группу объектов, не имеющих материально вещественного содержания и приносящих предприятию доход в течение периода, оговоренного национальным… … Финансово-кредитный энциклопедический словарь

ШКОЛА общеобразовательная - уч. воспитат. учреждение, базовый элемент образоват. системы. В этом качестве Ш. предмет исследования разл. дисциплин: пед., ист., демографич., социология, и др. Только в педагогике проблематика Ш. занимает вполне самостоят. место. Изученность… … Российская педагогическая энциклопедия

время - 3.3.4 время tE (time tE): время нагрева начальным пусковым переменным током IА обмотки ротора или статора от температуры, достигаемой в номинальном режиме работы, до допустимой температуры при максимальной температуре окружающей среды. Источник … Словарь-справочник терминов нормативно-технической документации

ГОСТ Р МЭК 60204-1-2007: Безопасность машин. Электрооборудование машин и механизмов. Часть 1. Общие требования - Терминология ГОСТ Р МЭК 60204 1 2007: Безопасность машин. Электрооборудование машин и механизмов. Часть 1. Общие требования оригинал документа: TN систем питания Испытания по методу 1 в соответствии с 18.2.2 могут быть проведены для каждой цепи… … Словарь-справочник терминов нормативно-технической документации

автоматический - 3.3.1 автоматический пробоотборник (automatic sampler): Устройство, используемое для извлечения представительной пробы жидкости, протекающей по трубопроводу. Примечание Автоматический пробоотборник обычно состоит из зонда (щупа), экстрактора… … Словарь-справочник терминов нормативно-технической документации

напряжение - 3.10 напряжение: Отношение растягивающего усилия к площади поперечного сечения звена при его номинальных размерах.

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

Рассмотрим j ‑й шаг сортировки (j =2, 3, ..., n ). Если K [ j ]>= K [ j -1] , то упорядоченность не нарушилась и следует перейти к R [ j +1]– ой записи. Если же K [ j ]< K [ j -1] , то R [ j ] запоминается в рабочей переменной (Rab = R [ j ]) и для нее ищется место в упорядоченной части таблицы – в подтаблице. Обозначим нижнюю границу индекса этой подтаблицы через ng , верхнюю - через vg (первоначально ng =1. vg =j-1 ).

Согласно бинарному поиску ключ K [ j ] рассматриваемой записи R [ j ] должен сначала сравниться с ключом K [ i ] записи R [ i ] , находящейся в середине упорядоченной подтаблицы (i=(ng+vg) div 2) . Если K [ j ]> K [ i ], то отбрасывается (то есть больше не рассматривается) левая часть подтаблицы- записи с меньшими ключами (ng = i +1) . Если K [ j ]< K [ i ] , то отбрасывается правая часть подтаблицы - записи с большими ключами (vg = i -1). В оставшейся части подтаблицы поиск продолжается. Процесс деления частей подтаблицы пополам продолжается до тех пор, пока не возникнет одна из следующих ситуаций:

1) K [ j ]= K [ i ] , следовательно, (i+1) -я позиция является местом для рассматриваемой записи. Сдвинем записи R [ i +1], R [ i +2], …, R [ j -1] на одну позицию вправо и освободим тем самым место для вставки (R [ i +1]= Rab ).

2) K [ j ]<> K [ i ] и ng > vg – ключи не совпали, а длина последней подтаблицы равна 1. В этом случае местом для вставки является позиция ng , поэтому записи R [ ng ], R [ ng +1], … , R [ j -1] должны быть сдвинуты на одну позицию вправо (R [ ng ]= Rab ) .

Алгоритм бинарного поиска подробно описан в разделе "Дихотомический поиск по совпадению".

Рассмотрим на примере j -й шаг сортировки (определяется место записи с ключом, равным 9; j =7, K [ j ]=9 ):

Среднее число сравнений для данного метода составляет n log 2 (n) .

Метод двухпутевой вставки

Метод двухпутевой вставки является модификацией метода вставки с прямым включением; он позволяет улучшить характеристики сортировки.

Для реализации этого метода необходим дополнительный объем памяти, равный объему, занимаемому таблицей, подлежащей сортировке (назовем его зоной вывода T ). На первом шаге сортировки в середину зоны вывода (позиция m=(n div 2)+1 ) помещается первая запись таблицы R. Остальные позиции Т пока пусты. На последующих шагах сортировки ключ очередной записи R [ j ] (j =2, 3, …, n ) сравнивается с ключом записи T [ m ] и, в зависимости от результатов сравнения, место для R [ j ] отыскивается в Т слева или справа от T [ m ] методом вставки. При этом должны запоминаться номера самого левого (l ) и самого правого (r ) внесенных в зону вывода элементов. Конечные значения l и r равны 1 и n соответственно.

В алгоритме должны быть учтены также следующие ситуации:

    ключ записи R[j] меньше ключа записи T[m] , но l=1 ;

    ключ записи R[j] больше ключа записи T[m] , но r=n .

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

Рассмотрим пример сортировки с использованием этого метода.

Пусть исходная последовательность ключей таблицы имеет вид:

24, 1, 28, 7, 25, 3, 6, 18, 8 (n =9, m =(n div 2)+ 1=5)

Номер шага

Зона вывода