계수 정렬(Count Sort) - fora22/CodingTest GitHub Wiki
계수 정렬은 특정한 조건에서만 사용할 수 있지만 매우 빠르게 동작하는 정렬 알고리즘이다.
계수 정렬은 데이터의 크기 범위가 제한되어 정수 형태로 표현할 수 있을 때 사용 가능한 알고리즘이다.
C++ 구현 코드는 다음과 같다.
#include <iostream>
#include <random>
#include <vector>
using namespace std;
vector<int> getRandomArray(const int randomNumberCount)
{
int temp, x, y;
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<int> dis(0, randomNumberCount - 1);
vector<int> randomArray(randomNumberCount);
for (int i = 0; i < randomNumberCount; i++)
{
//randomArray[i] = i + 1;
randomArray[i] = dis(gen); // CountSort use when data is type:int and range of data can express.
// So, I push random & overlap data to randomArray.
}
//for (int i = 0; i < randomNumberCount; i++)
//{
// x = dis(gen);
// y = dis(gen);
// if (x != y)
// {
// temp = randomArray[x];
// randomArray[x] = randomArray[y];
// randomArray[y] = temp;
// }
//}
return randomArray;
}
vector<int> countSort(vector<int>* rArray) {
int arraySize = (*rArray).size();
vector<int> countArray(arraySize);
int temp;
for (int i = 0; i < arraySize; i++) {
temp = (*rArray)[i];
countArray[temp] = countArray[temp] + 1;
}
return countArray;
}
int main(void)
{
const int randNumberLength = 100;
vector<int> randArray = getRandomArray(randNumberLength);
vector<int> resultArray = countSort(&randArray);
for (int i = 0; i < resultArray.size(); i++) {
for (int j = 0; j < resultArray[i]; j++) {
cout << i << endl;
}
}
return 0;
}
- 계수 정렬의 시간 복잡도는 전부 O(N + K)이다.
- 하지만 만약 데이터가 [0, 1 ,999]만 존재하는 경우 3개 데이터 정렬을 위해 1000개의 공간을 차지하는 리스트가 필요해진다.
- 따라서 데이터의 크기가 한정되어 있고, 중복된 데이터가 많다면 유리하지만
- 데이터 범위가 개수에 비해 너무 클 때 비효율적인 알고리즘이다.