Wstęp
Sortowanie to podstawowa operacja w informatyce, która polega na układaniu elementów w określoną kolejność, na przykład numeryczną lub alfabetyczną. Opracowano różne algorytmy sortowania, każdy ze wskaźnikami czasu i wydajności. Liniowe sortowanie po czasie to podzbiór algorytmów sortowania mający istotną zaletę: mogą sortować dany zbiór elementów w czasie liniowym, a czas wykonania rośnie liniowo wraz z rozmiarem danych wejściowych.
Najbardziej znanym algorytmem sortowania liniowego według czasu jest sortowanie malejące. Sortowanie obliczeniowe jest szczególnie efektywne, gdy zakres elementów wejściowych jest znany i stosunkowo niewielki. Eliminuje to potrzebę porównywania elementów, co jest główną czasochłonną operacją w wielu innych algorytmach sortowania. Wykorzystując wiedzę z dziedziny wejściowej, sortowanie obliczeniowe osiąga liniową złożoność czasową. Sortowanie numeryczne najpierw skanuje tablicę wejściową, aby określić liczbę każdego elementu. Następnie wykorzystuje te liczby do obliczenia prawidłowych pozycji elementów w uporządkowanej tabeli wyników. Algorytm składa się z następujących kroków:
- Aby określić zakres, należy określić minimalne i maksymalne wartości tablicy wejściowej.
- Utwórz arkusz zainicjowany rozmiarem zakresu i zerami.
- Wykonaj iterację po tablicy wejściowej i zwiększ każdy znaleziony element.
- Zmodyfikuj arkusz, obliczając skumulowaną sumę, aby uzyskać prawidłowe pozycje dla każdego elementu.
- Utwórz tablicę wyjściową o tym samym rozmiarze co tablica wejściowa.
- Przesuń ponownie tablicę wejściową, umieszczając każdy element we właściwej pozycji w tablicy wyjściowej na podstawie arkusza.
- Tabela wyników zawiera teraz posortowane elementy.
Główną zaletą sortowania malejącego jest to, że osiąga on liniową złożoność czasową O(n), co czyni go bardzo wydajnym w przypadku dużych rozmiarów danych wejściowych. Jednakże jego zastosowanie ogranicza się do scenariuszy, w których wybór elementów wejściowych jest znany z góry i stosunkowo niewielki.
Należy zauważyć, że inne algorytmy sortowania, takie jak szybkie sortowanie lub łączenie, mają zazwyczaj złożoność czasową O(n log n), co jest uważane za efektywne w wielu praktycznych zastosowaniach. Algorytmy liniowego sortowania według czasu, takie jak sortowanie numeryczne, stanowią alternatywę, gdy pewne ograniczenia lub właściwości danych wejściowych pozwalają na zastosowanie liniowej złożoności czasowej.
Historia
Algorytmy liniowego sortowania według czasu mają bogatą historię w informatyce. Rozwój liniowego porządku czasu datuje się na połowę XX wieku, a wkład naukowców i matematyków był znaczący. Jednym z najwcześniejszych algorytmów sortowania według czasu liniowego jest sortowanie segmentowe, zaproponowane przez Harolda H. Sewarda w 1954 roku. Sortowanie segmentowe dzieli elementy wejściowe na skończoną liczbę segmentów, a następnie sortuje każdy segment osobno. Algorytm ten ma liniową złożoność czasową, jeśli rozkład elementów wejściowych jest stosunkowo równomierny.
mapa skrótów Java
W 1959 roku Kenneth E. Iverson wprowadził algorytm radix, który osiąga liniową złożoność czasową. Radix sortuje elementy według ich numerów lub znaków od najmniej znaczącego do najbardziej znaczącego. Wykorzystuje niezawodne algorytmy sortowania, takie jak sortowanie numeryczne lub sortowanie segmentowe, aby sortować elementy w miejscu każdej cyfry. Sortowanie metodą Radix stało się popularne w epoce kart dziurkowanych i wczesnych systemów komputerowych. Jednak najbardziej znanym algorytmem sortowania liniowego według czasu jest wyliczenie, wprowadzone przez Harolda H. Sewarda i Petera Eliasa w 1954 r., a później niezależnie odkryte ponownie przez Harolda H. „Bobby'ego” Johnsona w 1961 r. Sortowanie numeryczne wzbudziło duże zainteresowanie.
Jest to szczególnie skuteczne, gdy zakres elementów wejściowych jest znany i stosunkowo niewielki. Historia liniowego sortowania według czasu była kontynuowana wraz z rozwojem innych wyspecjalizowanych algorytmów. Na przykład w 1987 roku Hanan Samet zaproponował sortowanie drzewa dystrybucji binarnej, algorytm sortowania liniowego po czasie dla danych wielowymiarowych. Przez lata badacze kontynuowali badania i udoskonalanie algorytmów planowania liniowego, koncentrując się na konkretnych scenariuszach i ograniczeniach. Chociaż algorytmy takie jak szybkie sortowanie i łączenie są szerzej stosowane ze względu na swoją wydajność w większej liczbie scenariuszy, algorytmy sortowania w czasie liniowym stanowią cenną alternatywę, gdy pewne okoliczności pozwalają na wykorzystanie złożoności czasu liniowego. Ogólnie rzecz biorąc, historia liniowego sortowania według czasu charakteryzuje się poszukiwaniem wydajnych algorytmów, które mogą sortować duże zbiory danych w czasie liniowym, przezwyciężając ograniczenia algorytmów sortowania opartego na porównaniach. Wkład różnych badaczy utorował drogę do opracowania i zrozumienia tych specjalistycznych technik sortowania.
Rodzaje liniowego sortowania według czasu
Istnieje kilka różnych algorytmów sortowania liniowego według czasu. Dwa główne typy to algorytmy oparte na liczbie i algorytmy oparte na podstawie. Oto najpopularniejsze algorytmy sortowania według czasu liniowego, sklasyfikowane w oparciu o następujące typy:
Algorytmy oparte na zliczaniu
Algorytmy oparte na podstawce
Zalety liniowego sortowania według czasu
Algorytmy liniowego sortowania według czasu, takie jak sortowanie numeryczne, oferują kilka zalet w określonych scenariuszach.
Wady liniowego sortowania według czasu
Chociaż algorytmy planowania liniowego mają swoje zalety, mają również pewne ograniczenia i wady:
Wybierając algorytm sortowania, należy dokładnie rozważyć specyfikę danych wejściowych i wymagania problemu sortowania. Chociaż algorytmy planowania liniowego oferują zalety w określonych scenariuszach, tylko czasami są najbardziej odpowiednim i efektywnym wyborem.
filtrowanie Pythona
Zastosowania algorytmów sortowania liniowego po czasie
Algorytmy sortowania liniowego po czasie są wydajne i mają wiele zastosowań w różnych dziedzinach. Oto kilka typowych zastosowań liniowego porządku czasu:
Implementacja liniowego sortowania według czasu w C++
Oto przykład programu implementującego sortowanie zliczające, które jest algorytmem sortowania liniowego według czasu:
#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();>
Oznacza to, że tablica wejściowa została posortowana w kolejności rosnącej przy użyciu algorytmu sortowania zliczającego, w wyniku czego otrzymano posortowaną tablicę [1, 2, 2, 3, 3, 4, 8].
W tym programie w języku C++ funkcja sortowania zliczającego przyjmuje odwołanie do wektora arr i uruchamia procedurę sortowania zliczającego. Znajduje maksymalną wartość tabeli, aby określić rozmiar arkusza. Następnie zlicza występowanie każdego elementu i oblicza sumę przedrostków arkusza. Następnie tworzy wektor wynikowy i porządkuje elementy zgodnie z arkuszem. Na koniec kopiuje posortowane elementy z powrotem do oryginalnej tablicy. W funkcji podstawowej przykładowa tablica {4, 2, 2, 8, 3, 3, 1} jest sortowana według algorytmu sortowania przez wyliczenie i wyświetlana jako posortowana macierz. Należy pamiętać, że program wykorzystuje biblioteki do pracy z wektorami i znajdowania maksymalnego elementu tablicy za pomocą funkcji max_element.