|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Модифікації алгоритму простих вставок
1.1. Бінарні вставки
Для прискорення числа порівнянь при пошуку місця, у яке потрібно вставити елемент X, можна використовувати логарифмічний пошук. Це означає, що спочатку Х порівнюється з елементом k[j/2], потім, у залежності від результату порівняння, з елементом, що лежить посередине між 1 і j/2 чи посередине між j/2+1 і j і т.і. При цьому число порівнянь для кожного j дорівнює приблизно log(j). Число пересилань елементів при цьому не змінюється і залишається приблизно рівним N¤/4. Схема алгоритму бінарних вставок може бути отримана невеликою модифікацією схеми з розділу 6.4. Час роботи алгоритму t приблизно оцінюється формулою:
t=a*N¤ + b*N + c*N*log
де a,b,c-невідомі константи, що залежать від програмної реалізації алгоритму.
1.2. Двухпутьові вставки
Число пересилань можна скоротити приблизно в 2 рази до N/8, якщо допустити зрушення елементів не тільки вправо, але і вліво. Для вихідного файлу резервується місце в пам'яті, рівне 2N+1,де N - число елементів у вихідному файлі. Перший елемент пересилається в середину вихідного файлу. Надалі елементи вихідного файлу зрушуються чи вправо вліво в залежності від того, у яку сторону потрібно зрушувати менше елементів. Файл із попереднього приклада буде сортуватися в такий спосіб.
Вих.файл.: 503 87 512 61 908 170 897 275
503 поч. стан °87 503 Х=87 87 503 °512 Х=512 °61 87 503 512 Х=61 61 87 503 512 °908 Х=908 61 87 °170 503 512 908 Х=170 61 87 170 503 512 °897 908 Х=897 61 87 170 °275 503 512 897 908 Х=275
З таблиці видно, що приєднання нових елементів до вихідного файлу відбувається як праворуч, так і ліворуч від центрального елемента 503 з можливим зрушенням чи вправо вліво. Час роботи алгоритму t приблизно оцінюється формулою: t=a*N¤ + b*N де a,b - невідомі константи, що залежать від програмної реалізації алгоритму.
1.3. Вставки одночасно декількох елементів.
Модифікація методу простих уставок полягає в тім, що замість однієї перемінної Х можна використовувати трохи перемінних Х1, Х2,... Xm, що мають значення елементів, що підлягають вставці у вже упорядковану частину файлу. Х1, X2,... Xm упорядковані по зростанню, тому порівнюючи Xm у циклі по перемінної і з елементами упорядкованої частини, ми можемо гарантувати, що, якщо черговий елемент k[і] більше Xm, те він більше й інших елементів. Перенос елементів вихідного файлу вперед у циклі по і виконується на m елементів, тобто замість k[і+1]=k[і] у вихідному алгоритмі в модифікованому алгоритмі записується k[і+m]=k[і]. При перебуванні k[і] такого, що він менше Хm, Хm ставиться на місце k[і+m] і m зменшується на 1. Далі цикл по і продовжується з новим m. Економія числа переносів елементів досягається за рахунок переносів відразу на m елементів. Час роботи алгоритму t приблизно оцінюється формулою:
t=a*N + b*N + c*N*log
де a,b,c - невідомі константи, що залежать від програмної реалізації алгоритму.
1.4. Вставки з убутним кроком (метод Шелла)
Ідея алгоритму складається в обміні елементів, розташованих не тільки поруч, як в алгоритмі простих уставок (п.1), але і далеко друг від друга, що значно скорочує загальне число операцій переміщення елементів. Для приклада візьмемо файл із 16 елементів. Спочатку проглядаються пари з кроком 8. Це пари елементів 1-9, 2-10, 3-11, 4-12, 5-13, 6-14, 7-15, 8-16. Якщо значення елементів у парі не упорядковані по зростанню, то елементи міняються місцями. Назвемо цей етап 8-сортуванням. Наступний етап - 4-сортування, на якому елементи у файлі поділяються на четвірки:1-5-9-13,2-6-10-14,3-7-11-15, 4-8-12-16. Виконується сортування в кожній четвірці. Сортування може виконуватися методом простих уставок (п.1). Наступний етап - 2-сортування, коли елементи у файлі поділяються на 2 групи по 8: 1-3-5-7-9-11-13-15 і 2-4-6-8-10-12-14-16. Виконується сортування в кожній вісімці. Нарешті весь файл упорядковується методом простих уставок. Оскільки далекі елементи вже перемістилися на своє чи місце знаходяться поблизу від нього, цей етап буде значно менш трудомістким, чим при сортуванні вставками без попередніх "далеких" обмінів. Для даного приклада результати представлені в наступній таблиці. Вихідний файл.На ньому виконується 8-сортування.Пари для можливого обміну з'єднані одинарними чи подвійними лініями. Подвійними лініями позначені пари, у яких відбувся обмін.
503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 └──┼───╫──┼──╫────┼───╫───┼───┘ │ ║ │ ║ │ ║ │ └───╫──┼──╫────┼───╫───┼───────┘ ║ │ ║ │ ║ │ ╙──┼──╫────┼───╫───┼───────────╜ │ ║ │ ║ │ └──╫────┼───╫───┼───────────────┘ ║ │ ║ │ ╙────┼───╫───┼───────────────────╜ │ ║ │ └───╫───┼───────────────────────┘ ║ │ ╙───┼───────────────────────────╜ │ └───────────────────────────────┘
Файл після 8-сортування. Лініями з'єднані четвірки для наступного етапу.
503 87 154 61 612 170 765 275 653 426 512 509 908 677 897 703 └───┼──┼──┼───┴───┼───╫───┼───┴───┼───╫───┼───┘ │ │ │ └──┼──┼───────┴───╫───┼───────┴───╫───┼───────┘ │ │ └──┼───────────╨───┼───────────╨───┼───────────┘ │ └───────────────┴───────────────┴───────────────┘ Файл після 4-сортування. Лініями з'єднані вісімки для наступного етапу.
503 87 154 61 612 170 512 275 653 426 765 509 908 677 897 703 ╙──╫───╨──╫───╨───┼───╨───┼───┴───┼───┴───┼───╨───┼───╜ │ ╙──────╨───────┴───────┴───────┴───────┴───────┴───────┘
Файл після 2-сортування:
154 61 503 87 512 170 612 275 653 426 765 509 897 677 908 703
Файл після остаточного сортування (1-сортування):
61 87 154 170 275 426 503 509 512 612 653 677 703 765 897 908
Час роботи алгоритму t приблизно оцінюється формулою: t=a*N**b
де a і b - невідомі константи, що залежать від програмної реалізації алгоритму.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |