Анализ методов сортировки одномерного массива

Автор: Татьяна Петришина, 03 Ноября 2010 в 13:09, курсовая работа

Краткое описание

В наш час нові інформаційні технології посідають дуже важливе місце не лише в спеціалізованих, але й в повсякденних сферах життя. Комп’ютери застосовуються в бізнесі, менеджменті, торгівлі, навчанні та багатьох інших сферах діяльності людини.
Комп’ютерні технології дуже зручні для виконання різноманітних операцій, але в різних сферах застосування ці операції різні. Тому, кожна окрема галузь, яка використовує специфічні технічні засоби, потребує своїх власних програм, які забезпечують роботу комп’ютерів.
Розробкою програмного забезпечення займається така галузь науки, як програмування. Вона набуває все більшого й більшого значення останнім часом, адже з кожним днем комп’ютер стає все більш необхідним, все більш повсякденним явищем нашого життя. Адже обчислювальна техніка минулих років вже майже повністю вичерпала себе і не задовольняє тим потребам, що постають перед людством.
Таким чином, нові інформаційні технології дуже актуальні в наш час і потребують багато уваги для подальшої розробки та вдосконалення. Поряд з цим, велике значення має також і програмування, яке є одним із фундаментальних розділів інформатики і тому не може залишатись осторонь.
Програмування містить цілу низку важливих внутрішніх задач. Однією з найбільш важливих таких задач для програмування є задача сортування. Під сортуванням звичайно розуміють перестановки елементів будь-якої послідовності у визначеному порядку. Ця задача є однією з найважливіших тому, що її метою є полегшення подальшої обробки певних даних і, насамперед, задачі пошуку. Так, одним з ефективних алгоритмів пошуку є бінарний пошук. Він працює швидше ніж, наприклад, лінійний пошук, але його можливо застосовувати лише за умови, що послідовність вже упорядкована, тобто відсортована.
Взагалі, відомо, що в будь-якій сфері діяльності, що використовує комп’ютер для запису, обробки та збереження інформації, усі дані зберігаються в базах даних, які також потребують сортування. Певна впорядкованість для них дуже важлива, адже користувачеві набагато легше працювати з даними, що мають певний порядок. Так, можна розташувати всі товари по назві або відомості про співробітників чи студентів за прізвищем або роком народження, тощо.
Задача сортування в програмуванні не вирішена повністю. Адже, хоча й існує велика кількість алгоритмів сортування, все ж таки метою програмування є не лише розробка алгоритмів сортування елементів, але й розробка саме ефективних алгоритмів сортування. Ми знаємо, що одну й ту саму задачу можна вирішити за допомогою різних алгоритмів і кожен раз зміна алгоритму приводить до нових, більш або менш ефективних розв’язків задачі. Основними вимогами до ефективності алгоритмів сортування є перш за все ефективність за часом та економне використання пам’яті.
У даній роботі мова буде йти про ефективність різних методів сортування даних у мові Pascal.
Об'єкт і предмет дослідження – методи сортування даних, використовувані в мові Pascal.
Метою даного дослідження є аналіз ефективності різних методів сортування даних у мові Pascal.
Взагалі , методи сортування поділяються на три типи:
методи сортування, що сортують без використання додаткової пам'яті, за винятком, можливо, невеликого стека і/або масиву;
методи, що використовують для сортування зв'язані списки і тому використовують N додаткових покажчиків збережених у пам'яті;
і методи, що мають потребу в додатковій пам'яті для збереження копії сортуемого файлу.
Мною були розглянуті переваги і недоліки таких методів сортування, як метод обміну, включення, вибору, злиття, методи Шелла і Хоара.

Оглавление

1. ТЕОРЕТИКО-МЕТОДОЛОГИЧЕСКИЕ АСПЕКТЫ ПРОБЛЕМЫ МЕТОДОВ СОРТИРОВКИ ДАННЫХ В ЯЗЫКЕ PASCAL
1.1 Поняття сортування
1.2 Критерії оцінки алгоритмів сортування
1.3 Класифікація алгоритмів сортування
1.4 Постановка задачі сортування і методи її рішення.
1.5 Сортування бульбашковим методом
1.6 Сортування вибором елемента
1.7 Сортування включенням
1.8 Сортування злиттям
1.9 Удосконалені алгоритми сортування. Сортування Шелла
1.10 Метод поділу (алгоритм "швидкого" сортування, метод Хоара)
1.11 Порівняльний аналіз методів сортування
ВИСНОВОК
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

Файлы: 1 файл

ДипУкр.doc

— 201.50 Кб (Скачать)

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

      var

      i,j : integer;

      x : DataItem;

      begin

      for i := 2 to count do

       begin

       for j := count downto i do

       if item[j-1]>item[j] then

       begin

       x := item[j-1];

       item[j-1] := item[j];

       item[j] := x;

        end;

        end;

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

      У цьому випадку дане "item" є  масивом елементів "DataItem", що сортується, а дане "count" містить число  елементів у масиві.

      Сортування  бульбашковим методом мають два  цикли. Оскільки число елементів масиву задається перемінної "count", зовнішній цикл викликає перегляд масиву count - 1 раз. Це забезпечує перебування кожного елемента у своєї позицій після завершення процедури. Внутрішній цикл призначений для фактичного виконання операцій порівняння й обміну.

      Для ілюстрації роботи сортування бульбашковим методом нижче подані результати кожного етапу сортування масиву "dcab":

      вихідне положення:   d c a b;

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

      другий  прохід:        a b d c;

      третій  прохід:        a b c d.

      При аналізі всякого сортування визначається число операцій порівняння й обміну, виконаних у кращому, середньому і гіршому випадках. Для сортування бульбашковим методом число порівнянь  залишається незмінним, оскільки два  цикли завжди виконуються задане число раз поза залежністю від упорядкованості вихідного масиву. Це означає, що при сортуванні бульбашковим методом завжди виконується 1/2 (n2-n) операцій порівняння, де "n" задає число сортируемых елементів масиву. Ця формула виводиться на тій підставі, що зовнішній цикл сортування бульбашковим методом виконується n-1 раз, а внутрішній цикл виконується n/2 разів. Їхнє перемножування дасть зазначену формулу. Число операцій обміну буде нульовим для найкращого випадку, коли вихідний масив уже є відсортованим. Число операцій обміну для середнього випадку буде дорівнює 3/4 (n2-n), а для найгіршого випадку буде дорівнює 3/2 (n2-n) раз. Можна помітити, що в міру погіршення упорядкованості вихідного масиву число неупорядкованих елементів наближається до числа порівнянь (кожен неупорядкований елемент вимагає три операції обміну). Сортування бульбашковим методом називають квадратичним алгоритмом, оскільки час його виконання пропорційно квадратові числа сортуємих елементів. Сортування великого числа елементів бульбашковим методом вимогає дуже багато часу, тому що час виконання сортування знаходиться в квадратичній залежності від числа елементів масиву. Наприклад, якщо не враховувати час операцій обміну, виконуваних для перестановки неупорядкованих елементів, то тоді при виконанні однієї операції порівняння протягом 0,001 секунд сортування десяти елементів займе 0,05 секунд, сортування ста елементів займе 5 секунд, а сортування 1000 елементів займе 500 секунд. Сортування 100 000 елементів (такий розмір має невеликий телефонний довідник) вимогала б 5 000 000 секунд або близько 1400 годин (тобто два місяці безперервної роботи)!   Сортування бульбашковим методом можна до деякої міри поліпшити і тим самим небагато поліпшити її тимчасові характеристики. Можна, наприклад, помітити, що сортування бульбашковим методом володіє одною особливістю: розташований не на своєму місці (наприкінці) масиву елемент (наприклад, елемент "а" у масиві "dcab") досягає свого місця за один прохід, а елемент, розташований на початку масиву (наприклад, елемент "d"), дуже повільно досягає свого місця. Необов'язково всі перегляди робити в одному напрямку. Замість цього всякий наступний перегляд можна робити в протилежному напрямку. В цьому випадку сильно віддалені від свого місця елементи швидко переміщатимуться у відповідне місце. Нижче показана поліпшена версія сортування бульбашковим методом, що одержав назву "човникового сортування" через відповідний характер рухів по масиву.

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

      {човникове  сортування є поліпшеною версією  сортування бульбашковим методом}

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

      var

      j, k, l, r: integer;

      x: DataItem;

      begin

      l := 2; r := count; k := count;

      repeat

      for j := r downto l do

      if item[j-1] then

      begin    { обмін }

      x := item[j-1];

      item[j-1] := item[j];

      item[j] := x;

      k := j;

      end;

      l := k+1;

      for j := l to r do

      if item[j-1]>item[j] then

      begin   { обмін }

      x := item[j-1];

      item[j-1] := item[j];

      item[j] := x;

      k := j;

      end;

      r := k-1;

      until l>r

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

      1.6 Сортування вибором елемента 

      При сортуванні вибором вибирається  елемент із найменшим значенням  і робиться його обмін з першим елементом масиву. Потім знаходиться  елемент із найменшим значенням  із що залишилися n-1 елементів і робиться його обмін із другим елементом і  т.д. до обміну двох останніх елементів. Наприклад, якщо сортування вибором застосувати для масиву "bdac", те будуть отримані наступні проходи:

      вихідне положення:   b d a c;

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

      другий  прохід:        a b b c;

      третій  прохід:        a b c d.

        На жаль як і в сортуванні бульбашковим методом зовнішній цикл виконується n-1 раз, а внутрішній цикл виконується n/2 разів. Це значить, що число порівнянь для сортування вибором дорівнює 1/2 (n2-n) і це сортування буде виконуватися занадто повільно для великого числа елементів. Число операцій обміну в найкращому випадку дорівнює 3(n-1), а в гіршому випадку дорівнює n2/4+3(n-1). У кращому випадку (коли вихідний масив вже упорядкований) буде потрібно поміняти місцями тільки n-1 елементів, а кожна операція обміну вимагає три операції пересилання.

      {сортування  вибором}

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

      var

      i, j, k: integer;

      x: DataItem;

      begin

      for i := i to count-1 do

      begin

      k := i;

      x := item[i];

      for j := і+1 to count do {знайти елемент із  найменшим значенням}

      if item[j]<x then

      begin

      k := j;

      x := item[j];

      end;

      item[k] := item[і];  {обмін}

      item[і] := x;

      end;

      end; {кінець сортування вибором}

      У середньому число операцій обміну дорівнює n(ln+y), де "y" є константою Эйлера, приблизно рівної 0,577216. Це значить, що незважаючи на однакове число операцій порівнянь для сортувань бульбашковим методом і сортувань вибором, число операцій обміну для середнього випадку буде значно меншим для сортування вибором.  

      1.7 Сортування включенням 

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

      Цей процес повторюється доти, поки всі елементи не будуть упорядковані. Наприклад, для масиву "dcab" сортування включенням буде проходити в такий спосіб:

      вихідне положення:   d c a b;

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

      другий  прохід:        a c d b; 

      третій  прохід:        a b c d.

      Нижче приводиться алгоритм сортування включенням:

      { сортування включенням }

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

      var

      i, l: integer;

      x: DataItem;

      begin

      for i := 2 to count do

      begin

      x := item[i];

      j := i-1;

      while (x<item[j]) and (j>0) do

      begin

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

      j := j-1;

      end;

      item[j+1] := x;

      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).

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

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

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

      1.8 Сортування злиттям

      В основі цього способу сортування лежить злиття двох упорядкованих ділянок масиву в одну впорядковану ділянку іншого масиву.

      Злиття  двох упорядкованих послідовностей можна порівняти з перебудовою  двох колон солдатів, вишикуваних  за зростом, в одну, де вони також  розташовуються за зростом. Якщо цим процесом керує офіцер, то він порівнює зріст солдатів, перших у своїх колонах і вказує, якому з них треба ставати останнім у нову колону, а кому залишатися першим у своїй. Так він вчиняє, поки одна з колон не вичерпається – тоді решта іншої колони додається до нової.

      Нехай у масиві Y з елемента Y[m] починається  впорядкована ділянка довжиною s, а  з елемента Y[m+s] – впорядкована ділянка  довжини r. Наприклад,

Y 1 3        13       2       4        88
                 m m+1         m+s-1 m+s m+s+1        m+s+r

      Результатом злиття повинна бути ділянка довжини r+s у масиві X:

X 1 2 3 4 13 88
               m m+1 m+2 m+3     m+s+r

      Таке  злиття двох ділянок у масиві Y у  ділянку масиву X задає процедура

      procedure mrg( var Y : ArT; m, s, r : Indx; var X : ArT);

      var mr, k : Indx; i, j : Extind;

      begin

      mr := m + s; { mr – початок правої частини  }

      i := m; j := mr; { i та j пробігають ліву й  праву ділянки масиву Y}

      for k := m to m + s + r - 1 do{заповнення X[m], … , X[m+s+r-1]}

      if i > m + s - 1 then

      begin X[k] := Y[j]; j := j + 1 end else

      if j > mr + r - 1 then

      begin X[k] := Y[i]; i := i + 1 end else

      if Y[i] < Y[j] then

      begin X[k] := Y[i]; i := i + 1 end else

      begin X[k] := Y[j]; j := j + 1 end

      end

      Тепер розглянемо сортування масиву A злиттям. На першому кроці елементи A[1], … , A[n] копіюються в допоміжний масив B[1], … , B[n]. Його елементи розглядаються парами B[1] і B[2], B[3] і B[4] тощо як упорядковані послідовності довжиною lp = 1 і зливаються за допомогою процедури mrg в масив A. Тепер там є впорядковані ділянки довжиною 2. За непарного n останній елемент A[n] залишається без змін як послідовність довжиною 1.

Информация о работе Анализ методов сортировки одномерного массива