계수 정렬(Count Sort) - fora22/CodingTest GitHub Wiki

계수 정렬은 특정한 조건에서만 사용할 수 있지만 매우 빠르게 동작하는 정렬 알고리즘이다.

계수 정렬은 데이터의 크기 범위가 제한되어 정수 형태로 표현할 수 있을 때 사용 가능한 알고리즘이다.

image

image

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개의 공간을 차지하는 리스트가 필요해진다.
  • 따라서 데이터의 크기가 한정되어 있고, 중복된 데이터가 많다면 유리하지만
  • 데이터 범위가 개수에 비해 너무 클 때 비효율적인 알고리즘이다.

Reference

⚠️ **GitHub.com Fallback** ⚠️