선형 시간 으로 양의 정수 값 을 정렬하는 데 관심이 있습니다 (균일 한 비용 측정을 가진 RAM 모델에서, 즉 정수는 최대 로그 크기를 가질 수 있지만 그에 대한 산술 연산은 가정합니다) 단위 시간). 물론 이것은 비교 기반 정렬 알고리즘으로는 불가능하므로 "근사"정렬, 즉 일부 순열 의 은 실제로 정렬되지 않지만 의 정렬 된 버전의 "좋은 근사치"입니다 . 나는 우리가 속편을 좀 더 기분 좋게 만들기 때문에 정수를 내림차순으로 정렬한다고 가정 할 것입니다.
근사 정렬 방법에 대한 하나 개의 가능한 기준은 다음 (*) :시키는 될 마다 대해 , 우리가 필요 (즉, "가 분류 된"리스트는 감소 함수 의해 위에서부터 제한됩니다 ). 실제 정렬이이를 충족한다는 것을 쉽게 알 수 있습니다. 는 보다 크지 않아야합니다. 따라서 최대 인 이며 일반적으로 는 보다 크지 않아야합니다. 어떤.
예를 들어, 요구 사항 (*)은 아래 알고리즘 (@Louis에서 제안)을 통해 달성 할 수 있습니다. 내 질문은 : 실제 정렬이 만족 해야하는 (*)와 같은 요구 사항을 부과하여 선형 시간에 정수를 "거의 정렬"하는이 작업에 대한 기존 작업이 있습니까? 아래의 알고리즘 또는 그 변형이 기존 이름을 가지고 있습니까?
편집 : 알고리즘을 수정하고 더 많은 설명을 추가했습니다.
연산:
INPUT: V an array of size n containing positive integers
OUTPUT: T
N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+
For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+
이 알고리즘은 다음과 같은 이유로 의도 된대로 작동합니다.
- 소자 경우 버킷에 다음 .
는 버킷 에 들어가 므로 j ≤ \ lfloor N / v \ rfloor ≤ N / v
- 소자 경우 버킷에 다음 중 또는 .
J = 분 ( N / V , N ) J = ⌊ N / V ⌋ J = N J = ⌊ N / V ⌋ J ≤ N / V < J + 1 N / ( J + 1 ) < V 는 버킷 에 들어가 므로 또는 입니다. 첫 번째 경우 는 을 의미하므로 입니다.
용 있다 기껏 버킷 요소 1 내지 .
하자 및하자 버킷의 1..j 하나의 원소의 총 개수가 될. 함으로써 2 우리는 모든 요소가 있는지 버킷 (와 )되도록이고 . 따라서 에서 까지의 버킷에있는 모든 요소 의 합 는 보다 큽니다 . 그러나 합 또한보다 작 따라서 따라서 우리에게 제공 또는 .
만족하는 (*), 즉 의 번째 원소 그러한하다
함으로써 3. 우리는이 상기 의 번째 원소 , 버킷에서 유래 와 따라서 .
이 알고리즘은 선형 시간이 걸립니다.
의 계산 에는 선형 시간이 걸립니다. 버킷은 삽입 및 반복 이있는 연결 목록으로 구현할 수 있습니다 . 중첩 루프는 요소가있는 횟수만큼 (즉, 회) 실행됩니다.