Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты на зачет.docx
Скачиваний:
51
Добавлен:
01.06.2015
Размер:
554.66 Кб
Скачать

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

Один из самых простых методов сортировки работает следующим образом: находим наименьший элемент в массиве и обмениваем его с элементом находящимся на первом месте. Потом повторяем процесс со второй позиции в файле и найденный элемент обмениваем со вторым элементном и так далее пока весь массив не будет отсортирован. Этот метод называется сортировка выбором,поскольку он работает, циклически выбирая наименьший из оставшихся элементов, как показано на рисунке 1. При первом проходе символ пробела уходит на первое место, обмениваясь с буквой ‘П’. На втором проходе элемент ‘В’ обменивается с элементом ‘Р’ и так далее.

Следующая программа дает полную реализацию этого процесса. Для каждого iот 1 доN-1, она обменивает наименьший элемент из a[i..N] с a[i]:

рисунок 1 Сортировка выбором

procedure selection; var i,j,min, t : integer; begin for i:=1 to N-1 do begin min := i; for j:=i+1 to N do if a[j]<a[min] then min := j; t := a[min]; a[min] :=a[i]; a[i] := t; end; end;

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

Этот метод – один из простейших, и он работает очень хорошо для небольших файлов. Его «внутренний цикл» состоит из сравнения a[i]<a[min] (плюс код необходимый для увеличенияjи проверки на то, что он не превысилN), что вряд ли можно еще упростить.

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

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

procedureinsertion;vari, j, v : integer;beginfori := 2toNdobeginv := a[i]; j:=i;while(a[j–1] > v)dobegina[j] := a[j–1]; dec(j);end; a[j] := v;end;end;

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

Рассматриваемый элемент вставляется в позицию посредством передвижения большего элемента на одну позицию вправо и затем размещением меньшего элемента в освободившуюся позицию, как показано на рисунке 2. Так ‘И’ при третьем шаге меньше всех остальных отсортированных элементов, поэтому мы «топим» его в начало массива. ‘М‘ больше ‘И’ но меньше всех остальных, поэтому мы помещаем его между ‘И’ и ‘П’, и так далее.

рисунок 2Сортировка вставкой

Этот процесс реализован в следующей программе. Для каждого iот 2 доN, подмассив a[1..i] сортируется посредством помещения a[i] в подходящую позицию среди уже отсортированных элементов:

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

Однако имеется еще одна важная деталь: программа insertionне всегда работает, посколькуwhileможет проскочить за левый край массива, когдаv– самый меньший элемент массива. Чтобы исправить ситуацию, мы помещаем «сторожевой» ключ в a[0], делая его, по крайней мере, не больше, чем самый маленький ключ массива. Сторожевые элементы повсеместно используются в ситуациях подобных этой для предотвращения дополнительной проверки (в данном случаеj>0), что почти всегда помогает во внутренних циклах.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]