알고리즘/알고리즘

선형시간 정렬

호두밥 2021. 10. 5. 23:17

계수정렬(Counting Sort)

 

1. 실제 숫자를 세는 방법으로 숫자가 몇 개인지를 기록한다.
  가장 작은 원소와 가장 큰 원소를 구한다.
  가장 작은 원소부터 가장 큰 원소까지의 실제 숫자를 key(index)로 가지는 배열을 만든다.
  배열에서 실제 숫자의 갯수를 센다.

2. 갯수를 하나씩 줄여가면서 해당 위치에 요소를 넣어준다.

 

의사코드

 

수행시간

O(N+K)

 

 * k는 입력되는 정수의 범위이다. 

 

계수정렬이 유리한 경우

동일한 숫자가 반복되고, MIN과 MAX 값의 범위가 적을 때

 

JAVA 구현

package algorithm;

import java.util.Arrays;

public class CountingSort {
	
	public int[] countingSort(int[] arr, int min, int max) {
		
		int[] c = new int[max-min+1];
		int[] out = new int[arr.length];
		
		for(int a : arr) {
			c[a-min]++;
		}
		
		for(int i = 1; i < c.length ; i++) {
			c[i] += c[i-1];
		}
		
		for(int i = arr.length-1; i>=0; i--) {
			
			out[c[arr[i]-min]-1] = arr[i];
			c[arr[i]-min]--;
		}
		
		return out;
	}

	


	public static void main(String[] args) {
		int[] arr = new int[] {3, 5, 1, 6, 9, 2, 4};
		
		CountingSort f= new CountingSort();
		
		int min = Integer.MAX_VALUE;
		int max = Integer.MIN_VALUE;
		
		for(int a : arr) {
			if(min>a) min = a;
			if(max<a) max = a;
		}
		
		int[] out = f.countingSort(arr, min,max);
		
		System.out.println(Arrays.toString(out));
		
	}
}

'알고리즘 > 알고리즘' 카테고리의 다른 글

해시 알고리즘 Hash Algorithm  (0) 2021.10.11
힙 정렬 Heap Sort  (0) 2021.09.21
퀵 정렬 Quick Sort  (0) 2021.09.21
탐욕 알고리즘 Greedy Algorithm  (0) 2021.09.20
플로이드-와샬 알고리즘 Floyd-Warshall Algorithm  (0) 2021.09.20