Элементарные методы сортировкиРефераты >> Программирование и компьютеры >> Элементарные методы сортировки
Программа sort3 использует даже более ограниченный доступ к файлу: это три операции вида «сравнить две записи и обменять их, если нужно, чтобы поместить запись с меньшим ключом на первое место». Программы, ограниченные такими операциями интересны, поскольку они подходят для реализации на аппаратном уровне. Мы изучим их более подробно позднее.
Все примеры программ используют для сортировки глобальный массив. Это не означает, что такой подход лучше или хуже чем передача массива как параметра. Все зависит от точки зрения и конкретного алгоритма. Массив сделан глобальным только потому, что тогда примеры становятся короче и понятней.
Сортировка Выбором
Один из самых простых методов сортировки работает следующим образом: находим наименьший элемент в массиве и обмениваем его с элементом находящимся на первом месте. Потом повторяем процесс со второй позиции в файле и найденный элемент обмениваем со вторым элементном и так далее пока весь массив не будет отсортирован. Этот метод называется сортировка выбором, поскольку он работает, циклически выбирая наименьший из оставшихся элементов, как показано на рисунке 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), что вряд ли можно еще упростить.
Кроме того, хотя сортировка выбором является методом «грубой силы», он имеет очень важное применение: поскольку каждый элемент передвигается не более чем раз, то он очень хорош для больших записей с маленькими ключами.
Сортировка Вставкой
Метод сортировки вставкой, почти столь же прост, что и сортировка выбором, но гораздо более гибкий. Этот метод часто используют при сортировке карт: берем один элемент и вставляем его в нужное место среди тех, что мы уже обработали (тем самым оставляя их отортированными).
рисунок 2 Сортировка вставкой |
Рассматриваемый элемент вставляется в позицию посредством передвижения большего элемента на одну позицию вправо и затем размещением меньшего элемента в освободившуюся позицию, как показано на рисунке 2. Так ‘И’ при третьем шаге меньше всех остальных отсортированных элементов, поэтому мы «топим» его в начало массива. ‘М‘ больше ‘И’ но меньше всех остальных, поэтому мы помещаем его между ‘И’ и ‘П’, и так далее.
Этот процесс реализован в следующей программе. Для каждого i от 2 до N, подмассив a[1 i] сортируется посредством помещения a[i] в подходящую позицию среди уже отсортированных элементов:
procedure insertion; var i, j, v : integer; begin for i := 2 to length(str) do begin v := a[i]; j:=i; while (a[j-1]>v) do begin a[j] := a[j-1]; dec(j); end; a[j] := v; end; end; |
Также как и при сортировке выбором, в процессе сортировки элементы слева от указателя i находятся уже в сортированном порядке, но они не обязательно находятся в своей последней позиции, поскольку их еще могут передвинуть направо чтобы вставить более маленькие элементы встреченные позже. Массив становится полностью сортированным когда указатель достигает правого края.
Однако имеется еще одна важная деталь: программа insertion не всегда работает, поскольку while может проскочить за левый край массива, когда v – самый меньший элемент массива. Чтобы исправить ситуацию, мы помещаем «сторожевой» ключ в a[0], делая его, по крайней мере, не больше, чем самый маленький ключ массива. Сторожевые элементы повсеместно используются в ситуациях подобных этой для предотвращения дополнительной проверки (в данном случае j>0), что почти всегда помогает во внутренних циклах.
Пузырьковая Сортировка
Элементарный метод сортировки, который часто дают на вводных занятиях – это пузырьковая сортировка: Стоящие рядом элементы массива обмениваются местами, до тех пор, пока встречаются неотсортированные пары. Реализация этого метода дана ниже.
procedure bubble; var i,j, t : byte; begin for i := 100 downto 1 do for j:=2 to i do if x[j-1]>x[j] then begin t:=x[j-1];x[j-1]:=x[j];x[j]:=t; end; end; |
Чтобы поверить в то, что она на самом деле работает, может потребоваться некоторое время. Для этого заметьте, что когда во время первого прохода мы встречаем максимальный элемент, мы обмениваем его с каждым элементом справа от него пока он не окажется в крайней правой позиции. На втором проходе мы помещаем второй максимальный элемент в предпоследнюю позицию и так далее. Пузырьковая сортировка работает также как и сортировка выбором, хотя она и делает гораздо больше работы на то, чтобы переместить элемент в его конечную позицию.
Характеристики Простейших Сортировок
Свойство 1 Сортировка выбором использует около сравнений и N обменов.
Свойство 2 Сортировка вставкой использует около сравнений и обменов в среднем, и в два раза больше в наихудшем случае.
Свойство 3 Пузырьковая сортировка использует около сравнений и обменов в среднем и наихудшем случаях.