Увод
Сортирање је суштинска операција у рачунарској науци која укључује сређивање елемената по одређеном редоследу, као што је нумерички или абецедни редослед. Развијени су различити алгоритми за сортирање, сваки са индикаторима времена и ефикасности. Линеарно сортирање по времену је подскуп алгоритама за сортирање са значајном предношћу: они могу сортирати дати скуп елемената у линеарном времену, време извођења расте линеарно са величином улаза.
Најпознатији алгоритам линеарног временског сортирања је опадајуће сортирање. Рачунарско сортирање је посебно ефикасно када је опсег улазних елемената познат и релативно мали. Ово елиминише потребу за упоређивањем елемената, што је главна операција која одузима много времена у многим другим алгоритмима за сортирање. Користећи знање о улазном домену, рачунарско сортирање постиже линеарну временску сложеност. Нумеричко сортирање прво скенира улазни низ да би одредило број сваког елемента. Затим користи ове бројеве за израчунавање тачних позиција елемената у табели са наређеним резултатима. Алгоритам се састоји од следећих корака:
- Да бисте одредили опсег, идентификујте минималне и максималне вредности улазног низа.
- Направите радни лист иницијализован величином опсега и нулама.
- Пређите преко улазног низа и повећајте сваки пронађени елемент.
- Измените радни лист тако што ћете израчунати збир да бисте добили тачне позиције за сваки елемент.
- Креирајте излазни низ исте величине као и улазни низ.
- Поново померите улазни низ, постављајући сваки елемент на исправан положај у излазном низу на основу радног листа.
- Табела резултата сада садржи сортиране елементе.
Главна предност опадајућег сортирања је да постиже линеарну временску сложеност од О(н), што га чини веома ефикасним за велике улазне величине. Међутим, његова примењивост је ограничена на сценарије где је избор улазних елемената унапред познат и релативно мали.
Важно је напоменути да други алгоритми за сортирање, као што су брзо сортирање или спајање, обично имају временску сложеност од О(н лог н), што се сматра ефикасним за многе практичне примене. Алгоритми линеарног временског сортирања, као што је нумеричко сортирање, пружају алтернативу када одређена ограничења или својства улаза дозвољавају коришћење линеарне временске сложености.
Историја
Алгоритми за линеарно временско сортирање имају богату историју у рачунарској науци. Развој линеарног временског поретка може се пратити до средине 20. века, а доприноси научника и математичара били су значајни. Један од најранијих алгоритама за линеарно временско сортирање је сортирање буцкет-а, које је предложио Харолд Х. Севард 1954. Буцкет сорт дели улазне елементе на коначан број буцкета, а затим сортира сваку канту посебно. Овај алгоритам има линеарну временску сложеност ако је дистрибуција улазних елемената релативно уједначена.
Године 1959. Кенет Е. Ајверсон је увео радикс алгоритам који постиже линеарну временску сложеност. Радик сортира елементе по броју или знацима од најмање значајног до најзначајнијег. Користи робусне алгоритме за сортирање, као што је нумеричко или буцкет сортирање, за сортирање елемената на свакој цифреној локацији. Радик сортирање је постало популарно у ери бушених картица и раних рачунарских система. Међутим, најпознатији линеарни алгоритам за временско сортирање је набрајање, које су увели Харолд Х. Севард и Петер Елиас 1954. године, а касније га је независно поново открио Харолд Х. 'Бобби' Јохнсон 1961. Нумеричко сортирање је добило значајну пажњу.
бројеви азбуке
Ово је посебно ефикасно када је опсег улазних елемената познат и релативно мали. Историја линеарног временског сортирања настављена је развојем других специјализованих алгоритама. На пример, 1987. Ханан Самет је предложио сортирање бинарног стабла дистрибуције, линеарни алгоритам за сортирање по времену за вишедимензионалне податке. Током година, истраживачи су наставили да проучавају и побољшавају алгоритме линеарног планирања, фокусирајући се на специфичне сценарије и ограничења. Иако се алгоритми као што су брзо сортирање и спајање више користе због своје ефикасности у више сценарија, алгоритми за сортирање по линеарном времену пружају вредне алтернативе када одређене околности дозвољавају да се искористи комплексност линеарног времена. Уопштено говорећи, историју линеарног временског сортирања карактерише тражење ефикасних алгоритама који могу сортирати велике скупове података у линеарном времену, превазилазећи ограничења алгоритама сортирања заснованих на поређењу. Доприноси различитих истраживача утрли су пут за развој и разумевање ових специјализованих техника сортирања.
Врсте линеарног временског сортирања
Постоји неколико различитих алгоритама линеарног временског сортирања. Два главна типа су алгоритми засновани на бројању и алгоритми засновани на радиксу. Ево најчешћих алгоритама линеарног сортирања времена, класификованих на основу следећих типова:
Алгоритми засновани на бројању
Алгоритми засновани на радиксу
Предности линеарног временског сортирања
Алгоритми линеарног временског сортирања, као што је нумеричко сортирање, нуде неколико предности у специфичним сценаријима.
Недостаци линеарног временског сортирања
Иако алгоритми линеарног планирања имају своје предности, они такође имају одређена ограничења и недостатке:
Када бирате алгоритам за сортирање, неопходно је пажљиво размотрити специфичности улазних података и захтеве проблема сортирања. Док алгоритми линеарног планирања нуде предности у специфичним сценаријима, они су само понекад најприкладнији или најефикаснији избор.
Примене алгоритама линеарног временског сортирања
Алгоритми за линеарно временско сортирање су ефикасни и имају много примена у различитим областима. Ево неких типичних примена линеарног временског реда:
Имплементација линеарног временског сортирања у Ц++
Ево примера програма који имплементира Цоунтинг Сорт, што је линеарни алгоритам за сортирање времена:
#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();>
Ово указује да је улазни низ сортиран у растућем редоследу коришћењем алгоритма Цоунтинг Сорт, што је резултирало сортираним низом [1, 2, 2, 3, 3, 4, 8].
У овом Ц++ програму, функција сортирања бројањем узима референцу на вектор арр и покреће рутину сортирања бројања. Проналази максималну вредност табеле да би одредио величину радног листа. Затим броји појављивање сваког елемента и израчунава збир префикса радног листа. Затим креира вектор резултата и поставља елементе у ред према радном листу. Коначно, копира сортиране елементе назад у оригинални низ. У примарној функцији, пример низа {4, 2, 2, 8, 3, 3, 1} се сортира помоћу алгоритма сортирања набрајања и штампа као сортирана матрица. Имајте на уму да програм користи библиотеке за рад са векторима и проналажење максималног елемента низа помоћу функције мак_елемент.