소개
정렬은 요소를 숫자 또는 알파벳 순서와 같은 특정 순서로 배열하는 컴퓨터 과학의 필수 작업입니다. 다양한 정렬 알고리즘이 개발되었으며 각각 시간 및 효율성 지표가 있습니다. 선형 시간 정렬은 중요한 이점이 있는 정렬 알고리즘의 하위 집합입니다. 주어진 요소 집합을 선형 시간으로 정렬할 수 있으며 런타임은 입력 크기에 따라 선형적으로 증가합니다.
가장 잘 알려진 선형 시간 정렬 알고리즘은 내림차순 정렬입니다. 계산 정렬은 입력 요소의 범위가 알려져 있고 상대적으로 작을 때 특히 효율적입니다. 이렇게 하면 다른 많은 정렬 알고리즘에서 시간이 많이 걸리는 작업인 요소를 비교할 필요가 없습니다. 입력 영역 지식을 사용하여 계산 정렬은 선형 시간 복잡도를 달성합니다. 숫자 정렬은 먼저 입력 배열을 스캔하여 각 요소의 개수를 결정합니다. 그런 다음 이 숫자를 사용하여 정렬된 결과 테이블에서 요소의 올바른 위치를 계산합니다. 알고리즘은 다음 단계로 구성됩니다.
- 범위를 결정하려면 입력 배열의 최소값과 최대값을 식별하십시오.
- 범위 크기와 0으로 초기화된 워크시트를 만듭니다.
- 입력 배열을 반복하고 발견된 각 요소를 증가시킵니다.
- 각 요소의 올바른 위치를 얻기 위해 누적 합계를 계산하여 워크시트를 수정합니다.
- 입력 배열과 동일한 크기의 출력 배열을 만듭니다.
- 입력 배열을 다시 이동하여 워크시트를 기준으로 출력 배열의 올바른 위치에 각 요소를 배치합니다.
- 이제 결과 테이블에는 정렬된 요소가 포함됩니다.
내림차순 정렬의 가장 큰 장점은 O(n)의 선형 시간 복잡도를 달성하므로 큰 입력 크기에 매우 효율적이라는 것입니다. 그러나 그 적용 가능성은 입력 요소의 선택이 미리 알려져 있고 상대적으로 작은 시나리오로 제한됩니다.
퀵소트(quicksort)나 병합(merge)과 같은 다른 정렬 알고리즘은 일반적으로 O(n log n)의 시간 복잡도를 가지며, 이는 많은 실제 응용 프로그램에서 효율적이라고 간주됩니다. 수치 정렬과 같은 선형 시간 정렬 알고리즘은 입력의 특정 제약 조건이나 속성으로 인해 선형 시간 복잡도를 사용할 수 있는 경우 대안을 제공합니다.
역사
선형 시간 정렬 알고리즘은 컴퓨터 과학에서 풍부한 역사를 가지고 있습니다. 선형 시간 순서의 발전은 20세기 중반으로 거슬러 올라갈 수 있으며, 과학자와 수학자들의 기여는 상당했습니다. 최초의 선형 시간 정렬 알고리즘 중 하나는 Harold H. Seward가 1954년에 제안한 버킷 정렬입니다. 버킷 정렬은 입력 요소를 한정된 수의 버킷으로 나눈 다음 각 버킷을 별도로 정렬합니다. 이 알고리즘은 입력 요소의 분포가 상대적으로 균일한 경우 선형 시간 복잡도를 갖습니다.
1959년에 Kenneth E. Iverson은 선형 시간 복잡도를 달성하는 기수 알고리즘을 도입했습니다. 기수는 숫자나 부호를 기준으로 요소를 가장 중요하지 않은 것부터 가장 중요한 것까지 정렬합니다. 숫자 또는 버킷 정렬과 같은 강력한 정렬 알고리즘을 사용하여 각 숫자 위치의 요소를 정렬합니다. 기수 정렬은 펀치 카드와 초기 컴퓨터 시스템 시대에 인기를 끌었습니다. 그러나 가장 잘 알려진 선형 시간 정렬 알고리즘은 1954년 Harold H. Seward와 Peter Elias가 도입한 열거형이며 나중에 1961년 Harold H. 'Bobby' Johnson이 독립적으로 재발견했습니다. 수치 정렬은 상당한 주목을 받았습니다.
이는 입력 요소의 범위가 알려져 있고 상대적으로 작을 때 특히 효과적입니다. 선형 시간 정렬의 역사는 다른 전문 알고리즘의 개발과 함께 계속되었습니다. 예를 들어, 1987년 Hanan Samet는 다차원 데이터에 대한 선형 시간 정렬 알고리즘인 이진 분포 트리 정렬을 제안했습니다. 수년에 걸쳐 연구자들은 특정 시나리오와 제약 조건에 초점을 맞춰 선형 스케줄링 알고리즘을 계속 연구하고 개선해 왔습니다. 더 많은 시나리오에서 효율성을 위해 퀵 정렬 및 병합과 같은 알고리즘이 더 널리 사용되지만 선형 시간 정렬 알고리즘은 특정 상황에서 선형 시간 복잡성을 활용할 수 있는 경우 귀중한 대안을 제공합니다. 일반적으로 선형 시간 정렬의 역사는 비교 기반 정렬 알고리즘의 한계를 극복하고 대용량 데이터 세트를 선형 시간으로 정렬할 수 있는 효율적인 알고리즘을 찾는 것이 특징입니다. 다양한 연구자들의 기여로 이러한 전문적인 분류 기술을 개발하고 이해할 수 있는 길을 열었습니다.
선형 시간 정렬의 유형
여러 가지 선형 시간 정렬 알고리즘이 있습니다. 두 가지 주요 유형은 개수 기반 알고리즘과 기수 기반 알고리즘입니다. 다음 유형에 따라 분류된 가장 일반적인 선형 시간 정렬 알고리즘은 다음과 같습니다.
계산 기반 알고리즘
기수 기반 알고리즘
선형 시간 정렬의 장점
숫자 정렬과 같은 선형 시간 정렬 알고리즘은 특정 시나리오에서 여러 가지 이점을 제공합니다.
선형 시간 정렬의 단점
선형 스케줄링 알고리즘에는 장점이 있지만 특정 제한 사항과 단점도 있습니다.
정렬 알고리즘을 선택할 때 입력 데이터의 세부 사항과 정렬 문제의 요구 사항을 신중하게 고려하는 것이 중요합니다. 선형 스케줄링 알고리즘은 특정 시나리오에서 이점을 제공하지만 때로는 가장 적절하거나 효율적인 선택일 때도 있습니다.
선형 시간 정렬 알고리즘의 응용
선형 시간 정렬 알고리즘은 효율적이며 다양한 분야에 많이 적용됩니다. 다음은 선형 시간 순서의 몇 가지 일반적인 응용 프로그램입니다.
C++에서 선형 시간 정렬 구현
다음은 선형 시간 정렬 알고리즘인 Counting Sort를 구현하는 프로그램의 예입니다.
#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 함수를 사용하여 배열의 최대 요소를 찾습니다.