Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 2012 / Тема 9 - Сортировка и методы поиска.doc
Скачиваний:
36
Добавлен:
16.03.2015
Размер:
99.33 Кб
Скачать

Сортировка выбором

При сортировке выбором выбирается элемент с наименьшим значением и делается его обмен с первым элементом массива. Затем находится элемент с наименьшим значением из оставшихся n-1 элементов и делается его обмен со вторым элементом и так далее до обмена двух последних элементов.

Например, если сортировку выбором применить для массива "2 4 1 3", то будут получены следующие проходы:

     - исходное состояние: 2 4 1 3;

    - первый проход:      1 4 2 3;

    - второй проход:      1 2 4 3;

     - третий проход:      1 2 3 4.

В этом методе внешний цикл выполняется n-1 раз, а внутренний цикл выполняется n/2 раз. Это значит, что число сравнений для сортировки выбором равно 1/2(n2-n) и эта сортировка будет выполняться слишком медленно для большого числа элементов. Число операций обмена в наилучшем случае равно 3(n-1), а в худшем случае равно n2/4+3(n-1). В лучшем случае (когда исходный массив уже упорядочен) потребуется поменять местами только n-1 элементов, а каждая операция обмена требует три операции пересылки.

{ сортировка выбором }       procedure Seleсt(var A: MyArray; n:integer);       var i, j, k, v: integer;

begin          for i := i to n-1 do begin            k := i;            v := A[i];            for j := i+1 to n do { найти элемент с наименьшим значением }            if A[j]<v then begin                k := j;                v := A[j];              end;            A[k] := A[i];  { обмен }            A[i] := v;          end;      end; { конец сортировки выбором  }

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

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

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

Например, для массива "4 3 1 2" сортировка вставкой будет проходить cледующим образом:

     - исходное состояние: 4 3 1 2;      - первый проход:      3 4 1 2;      - второй проход:      1 3 4 2;      - третий проход:      1 2 3 4.      Ниже приводится алгоритм сортировки вставкой:        { сортировка вставкой }        procedure Inser(var A: MyArray; n:integer);        var  i, l,v: integer;

       begin          for i := 2 to n do begin            v := A[i];            j := i-1;            while (v<A[j]) and (j>0) do  begin              A[j+1] := A[j];              j := j-1;            end;            A[j+1] := v;          end;      end;  { конец сортировки вставкой }

В отличие от сортировки пузырьковым методом и сортировки выбором число операций сравнения для сортировки вставкой зависит от исходной упорядоченности массива элементов. Если исходный массив уже упорядочен, то число операций сравнения равно n-1. Если массив упорядочен в обратном порядке, то число операций сравнения равно 1/2(n2 +n)-1, давая в среднем значение 1/4 (n2+n-2). Число операций обмена будет следующим: - для лучшего случая: 2 (n-1); - в среднем: 1/4 (n2+9n-10); - для худшего случая: 1/2 (n2+3n-4).

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

Во-первых, она обладает естественным поведением, т.е. она выполняется быстрее для упорядоченного массива и дольше всего выполняется, когда массив упорядочен в обратном направлении. Это делает сортировку вставкой полезной для упорядочения почти отсортированных массивов.

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