버킷 정렬
버킷 정렬은 비교 유형 정렬 알고리즘입니다. 요소를 버킷 또는 빈에 배포하고 다른 알고리즘 (일반적으로 삽입 정렬)을 사용하여 개별 버킷의 콘텐츠를 정렬하여 요소를 정렬합니다. 그런 다음 개별 정렬 된 버킷을 함께 추가하여 최종 정렬 된 배열을 얻습니다. 이러한 정렬 알고리즘 접근 방식을 분산 수집 접근 방식이라고도합니다. 주로 입력이 0.00
에서 1.00
까지의 부동 소수점과 같은 범위에 걸쳐 균일하게 분포 될 때 사용됩니다.
버킷 정렬 알고리즘
n
요소를 포함하는 정렬되지 않은 배열A[]
가 있다고 가정 해 보겠습니다.
-
입력 범위를 동일한 부분으로 나누는
k
(이상적으로k
는n
) 빈 빈 또는 버킷을 만듭니다. -
배열
A
내에있는 모든 요소A[i]
에 대해 다음을 수행합니다. -
A[i]
를 색인 된n * A[i]
버킷에 삽입합니다. -
삽입 정렬 알고리즘을 사용하여 개별 버킷을 정렬합니다.
-
버킷을 순서대로 확인하고 정렬 된 버킷을 연결하여 최종 정렬 된 배열을 형성합니다.
버킷 정렬 예
배열이(0.22,0.33,0.1,0.45,0.38,0.55,0.21,0.31)
이라고 가정합니다. 버킷 정렬 알고리즘을 사용하여 정렬합니다.
0.1
범위의 버킷10
을 만듭니다.
버킷 | 0 | 1 | 2 | 삼 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- 버킷에 요소를 삽입하면 다음을 얻습니다.
버킷 | 0 | 1 | 2 | 삼 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
0.1 | 0.22, 0.21 | 0.33, 0.38, 0.31 | 0.45 | 0.55 |
- 개별 버킷 정렬 :
버킷 | 0 | 1 | 2 | 삼 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
0.1 | 0.21, 0.22 | 0.31, 0.33, 0.38 | 0.45 | 0.55 |
모든 결과를 함께 추가하면 최종 정렬 된 배열이(0.1,0.21,0.22,0.31,0.33,0.38,0.45,0.55)
로 표시됩니다.
버킷 정렬 알고리즘 구현
#include <bits/stdc++.h>
using namespace std;
void bucketSort(float *array, int size) {
vector<float> bucket[size];
// insert elements into different buckets.
for (int i = 0; i < size; i++) {
bucket[int(size * array[i])].push_back(array[i]);
}
// sort individual buckets.
for (int i = 0; i < size; i++) {
sort(bucket[i].begin(), bucket[i].end());
}
int index = 0;
for (int i = 0; i < size; i++) {
while (!bucket[i].empty()) {
array[index++] = *(bucket[i].begin());
bucket[i].erase(bucket[i].begin());
}
}
}
int main() {
int n = 8;
float arr[8] = {0.22, 0.33, 0.1, 0.45, 0.38, 0.55, 0.21, 0.31};
cout << "Input arr: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n";
bucketSort(arr, n); // Sort elements in ascending order
cout << "Output arr: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n";
}
버킷 정렬 알고리즘 복잡성
시간 복잡성
- 평균 사례
평균적인 경우는 요소가 무작위로 분포 된 경우 발생하며 알고리즘은 매우 효율적인 결과를 제공합니다. 시간 복잡도는 [Big Theta] :O(n + k)
의 순서입니다. 평균 선형 시간 복잡도를 가진 몇 안되는 알고리즘 중 하나이며, 버킷 크기의 제곱의 합이 n
에서 선형이면이 복잡도가 유지됩니다.
- 최악의 경우
최악의 경우는 많은 요소가 배열에서 가까운 범위에 있고 동일한 버킷에서 함께 클러스터 될 때 발생합니다. 입력을 버킷으로 나누는 모든 이점을 없애고 전체 복잡성은 사용 된 정렬 알고리즘에 따라 달라집니다. 삽입 정렬은 요소가 역순 일 때 최악의 경우 시간 복잡도가 O(n2)입니다. 따라서 최악의 시간 복잡도는 [Big O] : O(n2)입니다.
- 베스트 케이스
가장 좋은 경우는 요소가 모든 버킷에 균일하게 분포되어 있거나 이미 정렬 된 배열을 얻을 때 발생합니다. 총 시간 복잡성은 O(n)
버킷을 만드는 데 필요한 시간과 O(k)
를 정렬하는 데 필요한 시간으로 구성됩니다. 최적의 시간 복잡도는 [Big Omega] :O(n + k)
입니다.
공간 복잡성
버킷 정렬 알고리즘의 최악의 경우 공간 복잡성은O(n * k)
이며 여기서n
은 요소 수이고k
는 버킷 수입니다. 모든 요소를 보관할 공간을 줄이고 버킷 시작에 대한 포인터를 저장하여 공간 복잡성을O(n + k)
로 줄일 수 있습니다.
Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.
LinkedIn