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};

์ด์ œ ๊ณ„์‚ฐ์„ ํ•˜์ž ์•„๋ž˜๋Š” ํ˜„์žฌ๊นŒ์ง€ ์ง„ํ–‰๋œ ์ƒํ™ฉ์ด๋‹ค.

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ • ์‹œ๊ฐํ™”


์ด์ œ๋ถ€ํ„ฐ ๊ฑฐ๊พธ๋กœ ๊ณ„์‚ฐ์„ ํ•˜์ž

arr[i]๋ฅผ cnt ๋ฐฐ์—ด์˜ idx๋กœ ์ฐพ์•„๊ฐ€๊ณ  ๊ทธ๋•Œ์˜ ๊ฐ’์—์„œ -1 ์—ฐ์‚ฐํ•œ ๋ฐฐ์—ด ์ž๋ฆฌ๋กœ ๊ทธ ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ • ์‹œ๊ฐํ™”

๊ทธ๋ฆฌ๊ณ  cnt ๋ฐฐ์—ด์˜ ํ•ด๋‹น idx ๊ฐ’์„ 1๊ฐœ ์—†์•ค๋‹ค.

๊ทธ ์ด์œ ๋Š” ๊ฐ’์ด ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด ์•ž์œผ๋กœ ์ฑ„์›Œ๋„ฃ๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ • ์‹œ๊ฐํ™”



์ด์ œ ๋งจ ๋’ค์›์†Œ๋ฅผ ๋ดค์œผ๋‹ˆ ๋‹ค์Œ์€ ๋งจ๋’ค์—์„œ 2๋ฒˆ์งธ๋ฅผ ํƒ์ƒ‰ํ•  ์ฐจ๋ก€๋‹ค

์ด์–ด์„œ ๋˜‘๊ฐ™์ด ์ง„ํ–‰๋˜๊ฒ ๋‹ค.

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ • ์‹œ๊ฐํ™”


๋‹ค์Œ



๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ฐธ๊ณ  ์ด๋ฏธ์ง€


๋‹ค์Œ



๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ฐธ๊ณ  ์ด๋ฏธ์ง€


๋‹ค์Œ



๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ฐธ๊ณ  ์ด๋ฏธ์ง€

๋‚˜๋จธ์ง€๋„ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ 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.

Trending Tags