Post

counting sort

🙋‍♂️ 들어가며

이번에는 계수정렬 (카운팅 소트)를 배워보도록 하자

해당 알고리즘은 O(N+K)로 K는 값의 범위에 따라 바뀐다.

즉 최댓값이 작을 수록 좋다.

이제 구현을 해보자

🤔 시작

1
int[] arr = {3,1,5,1,6,2,7,3,3};

이런 배열이 있다고 가정하자

그 이후 cnt배열을 만들어 배열의 크기는 max_num + 1까지 만들고

arr의 숫자만큼 칸을 채워주자 그러면 다음과 같을 것이다

1
int[] cnt = {0, 2, 1, 3, 0, 1, 1, 1}

그다음 제일 중요한 누적합을 해줘야한다

그러면 다음과 같을 것이다

1
int[] cnt = {0, 2, 3, 6, 6, 7, 8, 9};

이제 계산을 하자 아래는 현재까지 진행된 상황이다.

Desktop View


이제부터 거꾸로 계산을 하자

arr[i]를 cnt 배열의 idx로 찾아가고 그때의 값에서 -1 연산한 배열 자리로 그 값을 추가한다.

Desktop View

그리고 cnt 배열의 해당 idx 값을 1개 없앤다.

그 이유는 값이 여러개라면 앞으로 채워넣기 위함이다.

Desktop View



이제 맨 뒤원소를 봤으니 다음은 맨뒤에서 2번째를 탐색할 차례다

이어서 똑같이 진행되겠다.

Desktop View


다음



Desktop View


다음



Desktop View


다음



Desktop View

나머지도 똑같은 방식으로 res 배열이 채워지겠다

✅ 정답

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int[] arr = {3,1,5,1,6,7,2,3,3};
int N = arr.length;

// 1. 최댓값 구하기
int max = 0;
for (int i = 0; i < N; i++) {
    if (arr[i] > max) max = i;
}

// 2. 카운팅 배열
int[] cnt = new int[max + 1];

// 2-1. 카운팅 배열 초기 추가
for (int i = 0; i < N; i++) {
    cnt[ arr[i] ]++;
}


// 2-2. 카운팅 배열 누적합 적용
for (int i = 1; i < cnt.length; i++) {
    cnt[i] += cnt[i-1];
}


// 3. 오름차순 정렬
int[] res = new int[N];
for (int i = N-1; i >= 0; i--) {
    int cur_val = arr[i];
    res[ cnt[ arr[i] ] - 1 ] = cur_val;
    cnt[ arr[i] ]--;
}




결과

1
res = {1, 1, 2, 3, 3, 3, 5, 6, 7};
This post is licensed under CC BY 4.0 by the author.
3D GIF

Trending Tags

도움이 필요하면
나를 눌러 구리🐻
챗봇
너굴
bot
어서와 구리 ʕ ·ᴥ·ʔ
무엇이 필요하셔 구리?

Trending Tags

도움이 필요하면
나를 눌러 구리🐻
챗봇
너굴
bot
어서와 구리 ʕ ·ᴥ·ʔ
무엇이 필요하셔 구리?