вступ
Сортування — це важлива операція в інформатиці, яка включає впорядкування елементів у певному порядку, наприклад у числовому або алфавітному порядку. Розроблено різні алгоритми сортування, кожен з яких має показники часу та ефективності. Лінійне сортування за часом — це підмножина алгоритмів сортування зі значною перевагою: вони можуть сортувати заданий набір елементів за лінійний час, час виконання лінійно збільшується зі збільшенням розміру вхідних даних.
Найвідомішим алгоритмом лінійного сортування за часом є сортування за спаданням. Обчислювальне сортування є особливо ефективним, коли діапазон вхідних елементів відомий і відносно малий. Це усуває необхідність порівнювати елементи, головну трудомістку операцію в багатьох інших алгоритмах сортування. Використовуючи знання вхідної області, обчислювальне сортування досягає лінійної складності в часі. Числове сортування спочатку сканує вхідний масив, щоб визначити кількість кожного елемента. Потім він використовує ці числа для обчислення правильних позицій елементів у впорядкованій таблиці результатів. Алгоритм складається з наступних кроків:
- Щоб визначити діапазон, визначте мінімальне та максимальне значення вхідного масиву.
- Створіть робочий аркуш, ініціалізований розміром діапазону та нулями.
- Перебирайте вхідний масив і збільшуйте кожен знайдений елемент.
- Змініть робочий аркуш, підрахувавши сукупну суму, щоб отримати правильні позиції для кожного елемента.
- Створіть вихідний масив такого ж розміру, як і вхідний масив.
- Знову перемістіть вхідний масив, розмістивши кожен елемент у правильній позиції у вихідному масиві на основі аркуша.
- Таблиця результатів тепер містить відсортовані елементи.
Основна перевага сортування за спаданням полягає в тому, що воно досягає лінійної часової складності O(n), що робить його дуже ефективним для великих розмірів вхідних даних. Однак його застосування обмежене сценаріями, де вибір вхідних елементів відомий заздалегідь і відносно невеликий.
сортування вставкою
Важливо відзначити, що інші алгоритми сортування, такі як швидке сортування або злиття, зазвичай мають часову складність O(n log n), що вважається ефективним для багатьох практичних застосувань. Алгоритми лінійного сортування часу, такі як числове сортування, надають альтернативу, коли певні обмеження або властивості вхідних даних дозволяють використовувати лінійну часову складність.
історія
Алгоритми лінійного сортування часу мають багату історію в інформатиці. Розвиток лінійного порядку часу можна простежити до середини 20 століття, і внесок вчених і математиків був значним. Одним із найперших алгоритмів лінійного сортування в часі є ковшове сортування, запропоноване Гарольдом Х. Сьюардом у 1954 році. ковшове сортування ділить вхідні елементи на кінцеву кількість ковшів, а потім сортує кожне відро окремо. Цей алгоритм має лінійну часову складність, якщо розподіл вхідних елементів є відносно рівномірним.
У 1959 році Кеннет Е. Айверсон запропонував радикальний алгоритм, який досягає лінійної часової складності. Radix сортує елементи за їх номерами або знаками від найменш значущого до найбільш значущого. Він використовує надійні алгоритми сортування, такі як числове або групове сортування, щоб сортувати елементи в кожній позиції цифри. Сортування за системою Radix стало популярним в епоху перфокарт і ранніх комп'ютерних систем. Однак найвідомішим алгоритмом лінійного сортування за часом є перерахування, представлене Гарольдом Х. Сьюардом і Пітером Еліасом у 1954 році, а пізніше незалежно від нього знову відкрито Гарольдом Х. «Боббі» Джонсоном у 1961 році. Числовому сортуванню приділено значну увагу.
Це особливо ефективно, коли діапазон вхідних елементів відомий і відносно невеликий. Історія лінійного сортування часу продовжилася з розвитком інших спеціалізованих алгоритмів. Наприклад, у 1987 році Ханан Самет запропонував двійкове сортування дерева розподілу, лінійний алгоритм сортування за часом для багатовимірних даних. Протягом багатьох років дослідники продовжували вивчати та вдосконалювати алгоритми лінійного планування, зосереджуючись на конкретних сценаріях і обмеженнях. Хоча такі алгоритми, як швидке сортування та злиття, ширше використовуються через їхню ефективність у більшій кількості сценаріїв, алгоритми лінійного сортування надають цінні альтернативи, коли певні обставини дозволяють використати складність лінійного часу. Загалом, історія лінійного сортування за часом характеризується пошуком ефективних алгоритмів, які можуть сортувати великі набори даних за лінійний час, долаючи обмеження алгоритмів сортування на основі порівняння. Внесок різних дослідників проклав шлях для розробки та розуміння цих спеціалізованих методів сортування.
Типи лінійного сортування часу
Існує кілька різних алгоритмів лінійного сортування часу. Два основних типи — це алгоритми на основі підрахунку та алгоритми на основі основ. Ось найпоширеніші алгоритми лінійного сортування часу, класифіковані за такими типами:
Алгоритми на основі підрахунку
Алгоритми на основі Radix
Переваги лінійного сортування часу
Алгоритми лінійного сортування за часом, такі як числове сортування, пропонують кілька переваг у конкретних сценаріях.
Недоліки лінійного сортування часу
Хоча лінійні алгоритми планування мають свої переваги, вони також мають певні обмеження та недоліки:
різниця між двома рядками python
При виборі алгоритму сортування важливо ретельно враховувати особливості вхідних даних і вимоги задачі сортування. Хоча лінійні алгоритми планування пропонують переваги в конкретних сценаріях, вони лише іноді є найбільш відповідним або ефективним вибором.
Застосування алгоритмів лінійного сортування часу
Алгоритми лінійного сортування часу ефективні та мають багато застосувань у різних сферах. Ось кілька типових застосувань лінійного порядку часу:
Реалізація лінійного сортування часу в C++
Ось приклад програми, що реалізує Counting Sort, який є лінійним алгоритмом сортування за часом:
перерва java
#include #include using namespace std; void countingSort(vector& arr) { // Find the maximum element in the array int max_val = *max_element(arr.begin(), arr.end()); // Create a count array to store the count of each element vector count(max_val + 1, 0); // Count the occurrences of each element for (int num : arr) { count[num]++; } // Compute the prefix sum for (int i = 1; i <count.size(); i++) { count[i] +="count[i" - 1]; } create a sorted output array vector output(arr.size()); place the elements in order for (int i="arr.size()" 1;>= 0; i--) { output[count[arr[i]] - 1] = arr[i]; count[arr[i]]--; } // Copy the sorted elements back to the original array for (int i = 0; i <arr.size(); i++) { arr[i]="output[i];" } int main() vector arr="{4," 2, 8, 3, 1}; sort the array using counting countingsort(arr); print sorted cout << 'sorted array: '; for (int num : arr) ' endl; return 0; < pre> <p> <strong>Sample Output</strong> </p> <pre> Sorted array: 1 2 2 3 3 4 8 </pre> <p>This indicates that the input array has been sorted in ascending order using the Counting Sort algorithm, resulting in the sorted array [1, 2, 2, 3, 3, 4, 8].</p> <p>In this C++ program, the counting sort function takes a reference to the vector arr and runs the counting sort routine. It finds the table's maximum value to determine the worksheet's size. It then counts each element's occurrence and calculates the worksheet's prefix sum. Then, it creates a result vector and puts the elements in order according to the worksheet. Finally, it copies the sorted elements back into the original array. In the primary function, the example array {4, 2, 2, 8, 3, 3, 1} is sorted by the enumeration sort algorithm and printed as a sorted matrix. Note that the program uses libraries to work with vectors and find the maximum element of an array using the max_element function.</p> <hr></arr.size();></count.size();>
Це вказує на те, що вхідний масив було відсортовано за зростанням за допомогою алгоритму Counting Sort, у результаті чого отримано відсортований масив [1, 2, 2, 3, 3, 4, 8].
У цій програмі C++ функція сортування підрахунком приймає посилання на вектор arr і запускає процедуру сортування підрахунком. Він знаходить максимальне значення таблиці для визначення розміру аркуша. Потім він підраховує випадки появи кожного елемента та обчислює суму префіксів аркуша. Потім він створює вектор результатів і розміщує елементи в порядку відповідно до аркуша. Нарешті, він копіює відсортовані елементи назад у вихідний масив. У основній функції приклад масиву {4, 2, 2, 8, 3, 3, 1} сортується за допомогою алгоритму сортування за перерахуванням і друкується як відсортована матриця. Зверніть увагу, що програма використовує бібліотеки для роботи з векторами та пошуку максимального елемента масиву за допомогою функції max_element.