Смекни!
smekni.com

Анализ методов сортировки одномерного массива 2 (стр. 5 из 5)

Загальний метод, що використовує сортування включенням, застосовує принцип зменшення відстані між порівнюваними елементами. Нижче показана схема виконання сортування Шелла для масиву "f d a c b e". Спочатку сортуються всі елементи, що зміщені друг від друга на три позиції. Потім сортуються всі елементи, що зміщені на двох позицій. І, нарешті, упорядковуються всі сусідні елементи:

прохід 1 f d a c b e

прохід 2 c b a f d e

прохід 3 a b c e d f

отриманий результат a b c d e f

Алгоритм:

{ сортування Шелла }

procedure Shell(var item: DataArray; count:integer);

const

t = 5;

var

i, j, k, s, m: integer;

h: array[1..t] of integer;

x: DataItem;

begin

h[1]:=9; h[2]:=5; h[3]:=3; h[4]:=2; h[5]:=1;

for m := 1 to t do

begin

k:=h[m];

s:=-k;

for i := k+1 to count do

begin

x := item[i];

j := i-k;

if s=0 then

begin

s := -k;

s := s+1;

item[s] := x;

end;

while (x<item[j]) and (j<count) do

begin

item[j+k] := item[j];

j := j-k;

end;

item[j+k] := x;

end;

end;

end; { кінець сортування Шелла }

При поверхневому погляді на алгоритм не можна сказати, що він дає гарний результат і навіть те, що в результаті вийде відсортований масив. Однак, він дає і те й інше. Ефективність цього алгоритму пояснюється тим, що при кожному проході використовується відносно невелике число елементів або елементи масиву вже знаходяться у відносному порядку, а упорядкованість збільшується при кожному новому перегляді даних.

Відстані між порівнюваними елементами можуть змінюватися по-різному. Обов'язковим є лише те, що останній крок повинний дорівнювати одиниці. Наприклад, гарні результати дає послідовність кроків 9, 5, 3, 2, 1, що використана в показаному вище прикладі. Варто уникати послідовностей ступеня двійки, що, як показують складні математичні викладення, знижують ефективність алгоритму сортування. (Однак, при використанні таких послідовностей кроків між порівнюваними елементами це сортування буде як і раніше працювати правильно).

Внутрішній цикл має дві умови перевірки. Умова "х<item[j]" необхідна для упорядкування елементів. Умови "j>0" і "j<=count" необхідні для того, щоб запобігти вихід за межі масиву "item". Ця додаткова перевірка до деякої міри погіршує сортування Шелла. Злегка змінені версії сортування Шелла використовують спеціальні керуючі елементи, що не є в дійсності частиною тієї інформації, що повинна сортуватися. Елементи, що управляють, мають граничні для масиву даних значення, тобто найменше і найбільше значення. У цьому випадку не обов'язково виконувати перевірку на граничні значення. Однак, застосування таких керуючих елементів вимагає спеціальних знань про ту інформацію, що сортується, і це знижує універсальність процедури сортування.

Аналіз сортування Шелла вимагає рішення деяких складних математичних задач. Час виконання сортування Шелла пропорційно n. Ця залежність значно краще квадратичної залежності, який підкоряються розглянуті раніше алгоритми сортування. Однак, перш ніж ви вирішите використовувати сортування Шелла, варто мати на увазі, що швидке сортування дає навіть ще кращі результати.

1.10 Метод поділу (алгоритм "швидкого" сортування, метод Хоара)

Метод швидкого сортування був розроблений Ч. Ф. Р. Хоаром і він же дав йому цю назву. В даний час цей метод сортування вважається найкращим. Він заснований на використанні обмінного методу сортування. Це тим більше дивно, якщо врахувати дуже низьку швидкодію сортування бульбашковим методом, що являє собою найпростішу версію обмінного сортування.

В основі швидкого сортування лежить принцип розбивки. Спочатку вибирається деяке значення в якості "основи" і потім весь масив розбивається на дві частини. Одну частину складають всі елементи, рівні або більше "основи", а іншу частину складають всі елементи меншого значення, по якому робиться розбивка. Цей процес продовжується для частин, що залишилися, доти, поки весь масив не буде відсортований. Наприклад, для масиву "fedacb" при використанні як значення розбивки "d" будуть отримані наступні проходи при виконанні швидкого сортування:

вихідний стан: f e d a c b;

перший прохід: d c a d e f;

другий прохід: a b c d e f.

Цей процес продовжується для кожної частини "abc" і "def". Фактично цей процес має рекурсивну природу. І дійсно, найбільше "акуратно" швидке сортування реалізується за допомогою рекурсивного алгоритму. Вибір значення розбивки можна зробити двома способами. Це значення можна вибирати випадковим образом або шляхом усереднення невеликого числа значень, обраних з масиву. Для оптимального сортування потрібно вибрати значення, що буде знаходитися в точності посередині всіх елементів.

Однак, для більшості наборів даних це зробити нелегко. Однак, навіть у гіршому випадку, коли вибирається одне з екстремальних значень, швидке сортування працює досить добре.

В алгоритмі швидкого сортування, що приводиться нижче, як значення розбивки використовується середнє значення. Хоча такий підхід не завжди є найкращим, він досить простий і сортування буде виконуватися правильно.

{ швидке сортування }

procedure QuickSort(var item: DataArray; count:integer);

procedure qs(l, r: integer; var it: DataArray);

var

i, j: integer;

x, y: DataItem;

begin

i:=l; j:=r;

x:=it[(l+r) div 2];

repeat

while it[i]<x do i := i+1;

while x<it[j] do j := j-1;

if y<=j then

begin

y := it[i];

it[i] := it[j];

it[j] := y;

i := i+1; j := j-1;

end;

until i>j;

if l<j then qs(l, j, it);

if l<r then qs(i, r, it)

end;

begin

qs(1, count, item);

end; { кінець швидкого сортування }

У даному прикладі процедура швидкого сортування звертається до основної процедури сортування з ім'ям "qs". Це забезпечує доступ до даних "item" і "count" при усіх викликах "qs".

Можна вважати, що число операцій порівняння дорівнює n*log2n, а число операцій обміну дорівнює приблизно n/6*log2n. Ці характеристики значно краще характеристик розглянутих раніше сортувань.

Однак, варто мати на увазі одна неприємна властивість швидкого сортування. Якщо обиране для розбивки значення виявляється співпадаючої з максимальним значенням, то швидке сортування перетворюється в саму повільну з часом виконання n. Однак на практиці цей випадок не зустрічається.

1.11 Порівняльний аналіз методів сортування

Отже, який же метод є кращим? І від чого залежить вибір того або іншого методу при рішенні задач на сортування?

Виходячи з того, що основним критерієм ефективності алгоритму сортування є швидкість, можна зробити висновок, що методи Шелла і Хоара є найбільш оптимальними.

Недоліком "швидкої" сортування є можливість різкого збільшення трудомісткості при "несприятливому" вихідному порядку елементів у масиві. З іншого боку, метод "Шелла" у цілому відстає по швидкості від "швидкої" сортування.

Однак у деяких програмах сортування краще використовувати прості алгоритми. Програми сортування часто використовуються тільки один раз (або кілька разів). Якщо кількість елементів, який потрібно відсортувати не велике (скажемо менше ніж 500 елементів), то може виявитися, що використання простого алгоритму буде більш ефективно, чим розробка і налагодження складного алгоритму. Елементарні методи завжди придатні для маленьких файлів (скажемо менших, чим 50 елементів); малоймовірно, що складний алгоритм було б розумно використовувати для таких файлів, якщо звичайно не потрібно сортувати велику кількість таких файлів.

Як правило, елементарні методи, що були мною розглянуті, роблять біля N2 операцій для сортування N довільно узятих елементів. Якщо N досить мало, то це може і не бути проблемою, і якщо елементи розподілені не довільним образом, те ці алгоритми можуть працювати навіть швидше, ніж складні. Однак варто запам'ятати те, що ці алгоритми не слід використовувати для великих, довільно упорядкованих файлів.

У такий спосіб вибір на користь того або іншого алгоритму може бути зроблений за умови ретельного статистичного аналізу реальної задачі.

ВИСНОВОК

Задача сортування в програмуванні не вирішена цілком. Хоч і існує велика кількість алгоритмів сортувань, усе-таки таки метою програмування є не тільки розробка алгоритмів сортування елементів, але і розробка найефективніших алгоритмів сортування.

Розглянуті в даній роботі методи сортування мають як переваги, так і недоліки. Вибір того або іншого алгоритму сортування залежить від конкретної задачі.

Так, сортування великого числа елементів бульбашковим методом, методом вставки або вибору вимогає багато часу, тому що час виконання сортування знаходиться в квадратичній залежності від числа елементів масиву. Для великих обсягів даних ці сортування будуть повільними, а починаючи з деякої величини, вони будуть занадто повільними, щоб їх можна було використовувати на практиці. Однак, вони ідеально підходять для сортування невеликої кількості елементів. Крім цього, сортування включенням має дві переваги. По-перше, воно має природне поводження, тобто воно виконується швидше для упорядкованого масиву і довше всего виконується, коли масив упорядкований у зворотному напрямку. Це робить сортування включенням корисним для упорядкування майже відсортованих масивів. По-друге, елементи з однаковими ключами не переставляються: якщо список елементів сортується з використанням двох ключів, то після завершення сортування включенням він як і раніше буде упорядкований по двох ключах.

І, нарешті, деякі з простих методів можна розширити до більш хороших методів або використовувати їх для поліпшення складніших. Наприклад, таких як метод Хоара і метод Шелла.


СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Глушков, В.Н. Основи безпаперової інформатики Изд. 2-і, испр./Н. В. Глушков - М: Наука, 1987.- 232с.

2. Джордейн, Р. Довідник програміста персональних комп'ютерів типу IBM PC, XT і AT: Пер. с англ./ Предисл. Н.В. Гайского, 2001 – 116с.

3. Довгаль, С.И. Персональні ЕОМ: Турбо-Паскаль V6.0, Об'єктне програмування, Локальні мережі. (навчальний посібник)/, С.И. Довгаль, Б.Ю. Литвинов, А.И. Сбитнєв , - Київ: Информсистема сервіс, 1993. - 210с.

4. Зубків, С.В. Assembler, DOS, Windows і Unix./С.В. Зубків - М.: ДМК, 1999.-640с.

5. Корнеев, В.В. Сучасні мікропроцесори. /В.В. Корнеев, А.В. Кисельов - М.: Нолидж, 1998.-376с.

6. Гук, М.А. Процесори Pentium II, Pentium Pro і просто Pentium./ М.А. Гук - С-Пб: Питер, 1999. - 183с.

7. Офіцерів, Д.В. Програмування в інтегрованому середовищі Турбо-Паскаль: Справ. посібник. /Д.В. Офіцерів, В.А. Старих - Мн.: Бєларусь, 1992. - 240с.

8. Павловская, Т.А. Паскаль. Програмування мовою високого рівня: Підручник для вузів/ Т.А. Павловская – Спб.: Питер, 2006. - 123 с.

9. Перминов, О.Н. Програмування мовою Паскаль. / О.Н. Перминов - М.: Радіо і зв'язок, 1988. - 156с.

10. Прайс, Д. Програмування мовою Паскаль: Практичне керівництво. Пер. с англ./Д. Прайс - М.: Світ, 1987. - 232с.