Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Все Разделы.docx
Скачиваний:
17
Добавлен:
21.09.2019
Размер:
607.75 Кб
Скачать
      1. Сортировка бинарными включениями

Алгоритм сортировки простыми включениями можно легко улучшить, пользуясь тем, что готовая последовательность a[0], ..., a[i-1], в которую нужно включить новый элемент, уже упорядочена. Поэтому место включения можно найти быстрее, применив бинарный поиск, который определяет срединный элемент готовой последовательности и продолжает деление пополам, пока не будет найдено место включения. Модифицированный алгоритм сортировки называется сортировкой бинарными включениями, он показан в следующей программе:

Рrocedure BinInsSort;

Var i, j, L, R, m: Integer;

x: TElement;

Begin

For i:=2 To N Do Begin

x:= a[i-1]; L:= 1; R:= i-1;

While L <= R Do Begin

m:= (L + R) Div 2;

If x.Кey < a[m-1].Кey Then R:= m - 1

Else L:= m + 1;

End;

For j:= i-1 Downto L Do a[j]:= a[j-1];

a[l-1]:= x;

End

End;

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

      1. Сортировка прямым выбором

Этот метод основан на следующем алгоритме:

  • выбираем (выделяем) элемент с наименьшим (среди всех N элементов) ключом, допустим это элемент a[k]:

a[k].Key = min(a[0].Key, a[1].Key, …, a[HighIndex].Key)

  • элемент a[k] меняется местами с первым элементом, т. е. с элементом a[0].

Затем выбираем элемент с наименьшим ключом среди всех элементов, кроме элемента a[0]; меняем его местами с элементом a[1] и т. д.

Эти операции затем повторяются с оставшимися N2 элементами, затем с N3 элементами, пока не останется только один элемент  наибольший. Метод, основанный на принципе пошагового выбора, продемонстрирован на тех же восьми ключах:

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

For i:=0 To HighIndex Do

Begin

присвоить k индекс

наименьшего элемента из a[i], … a[HighIndex];

поменять местами a[i] и a[k];

end;

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

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

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

Рrocedure DirSelSort;

Var i, j, k: Integer;

x: TElement;

Begin

For i:=0 To HighIndex-1 Do Begin

x:=a[i]; k:= i;

For j:=i+1 To HighIndex Do

If x.Key > a[j].Key Then Begin

k:=j; x:=a[j];

End;

a[k]:=a[i]; a[i]:=x;

End

End;