ํน์ ํ ์กฐ๊ฑด์ด ๋ถํฉํ ๋๋ง ์ฌ์ฉํ ์ ์์ง๋ง ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
<ํน์ ํ ์กฐ๊ฑด> ๊ณ์ ์ ๋ ฌ์ ๋ฐ์ดํฐ ํฌ๊ธฐ ๋ฒ์๊ฐ ์ ํ๋์ด ์ ์ ํํ๋ก ํํํ ์ ์์ ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N, ๋ฐ์ดํฐ(์์) ์ค ์ต๋๊ฐ์ด K์ผ ๋ ์ต์ ์ ๊ฒฝ์ฐ์๋ โญ์ํ ์๊ฐ O(N+K)๋ฅผ ๋ณด์ฅํ๋ค.
์ฃผ์ด์ง ๋ฐฐ์ด์ ๊ฐ ๋ฒ์๊ฐ ์์ ๊ฒฝ์ฐ ๋น ๋ฅธ ์๋๋ฅผ ๊ฐ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. โญ์ต๋๊ฐ๊ณผ ์ ๋ ฅ ๋ฐฐ์ด์ ์์ ๊ฐ ๊ฐ์๋ฅผ ๋์ ํฉ์ผ๋ก ๊ตฌ์ฑํ ๋ฐฐ์ด๋ก ์ ๋ ฌ์ ์ํํ๋ค.
โญ๊ณ์ ์ ๋ ฌ์ ํน์ ํ ์กฐ๊ฑด์ด ๋ถํฉ๋ ๋๋ง ์ฌ์ฉํ ์ ์์ง๋ง ๋ฐ์ดํฐ ์๊ฐ ๋ง๋๋ผ๋ ์ค๋ณต๋ ๊ฐ์ด ๋ง์ด ๋ถํฌ๋ผ์๋ ๋ฐฐ์ด์ ์ ๋ ฌํ ๋ ํจ๊ณผ์ ์ด๊ณ ๋น ๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ต๋, ์ต์ ๊ฐ ์ฐจ์ด๊ฐ 100๋ง ์ดํ์ผ ๊ฒฝ์ฐ ํจ๊ณผ์ ์ด๋ค. ์นด์ดํ ์ ๋ ฌ์ด๋ผ๊ณ ํ๊ธฐ๋ ํ๋ค. ์ ํ, ์ฝ์ , ํต ์ ๋ ฌ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ๋ฉฐ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ ๋น๊ต ๊ธฐ๋ฐ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋ค.
โญโญ
1. ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ถํฐ ๊ฐ์ฅ ํฐ ๋ฐ์ดํฐ๊น์ง์ ๋ฒ์๊ฐ ๋ชจ๋ ๋ด๊ธธ ์ ์๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑ
2. ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉฐ ๋ฐ์ดํฐ์ ๊ฐ๊ณผ ๋์ผํ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๋ฅผ 1์ฉ ์ฆ๊ฐ
3. ์ฆ๊ฐ๋ ๋ฆฌ์คํธ์์ 0์ธ ๊ฐ์ ์ ์ธํ๊ณ , ์ธ๋ฑ์ค๋ฅผ ์ธ๋ฑ์ค ๊ฐ๋งํผ ์ถ๋ ฅ
์ถ์ฒ : https://medium.com/@manishsundriyal/counting-sort-in-javascript-abf976e66b8c
์ถ์ฒ : https://spagnuolocarmine.github.io/counting-sort.html
def counting_sort(arr):
max_arr = max(arr)
count = [0] * (max_arr + 1) #โญ ๋ฐฐ์ด์ต๋๊ฐ+1๋งํผ ์ธ๋ฑ์ค ์์ ๋ง๋๋ ๋์์ ๋ฐฐ์ด ๊ฐ 0์ผ๋ก ์ด๊ธฐํ
sorted_arr = list() # โญ ๋ฐฐ์ด๊ฐ์ฒด sorted_arr ์ ์ธ
for i in arr: # โญ์นด์ดํ
(๋ฐฐ์ด์ 0๋ถํฐ max_arr๊น์ง ์กด์ฌํ๋ ์ํ)
count[i] += 1
for i in range(max_arr + 1): # โญ์กด์ฌํ๋ ์ธ๋ฑ์ค 0~max_arr+1๊น์ง
for _ in range(count[i]): # โญ ๋๋ฏธ๋ณ์ '_'ํ์ฉํ์ฌ count[i]์ ์ ์ฅ๋ ๊ฐ๋งํผ ๋ฐ๋ณต
sorted_arr.append(i) # โญ sorted_arr์ i ๋ถ์ด๊ธฐ
return sorted_arr # โญ sorted_arr ๋ฐํ
def counting_sort(arr):
count = dict()
sorted_arr = list()
for i in arr:
if i in count:
count[i] += 1
else:
count[i] = 1
for i in sorted(count.keys()):
for _ in range(count[i]):
sorted_arr.append(i)
return sorted_arr
# ๐<collections> ๋ชจ๋์ defaultdict๋ฅผ ํ์ฉ
from collections import defaultdict
def counting_sort(arr):
count = defaultdict(int)
sorted_arr = list()
for i in arr:
count[i] += 1
for i in sorted(count.keys()):
for _ in range(count[i]):
sorted_arr.append(i)
return sorted_arr
public class CountingSort {
public static void main(String[] args) {
int[] array = new int[100]; // ์์ด์ ์์ : 100๊ฐ
int[] counting = new int[31]; // ์์ ๋ฒ์ : 0 ~ 30
int[] result = new int[100]; // ์ ๋ ฌ ๋ ๋ฐฐ์ด
for(int i = 0; i < array.length; i++) {
array[i] = (int)(Math.random()*31); // 0 ~ 30
}
// Counting Sort
// ๊ณผ์ 1
for(int i = 0; i < array.length; i++) {
// array ์ value ๊ฐ์ index ๋ก ํ๋ counting ๋ฐฐ์ด ๊ฐ 1 ์ฆ๊ฐ
counting[array[i]]++;
}
// ๊ณผ์ 2
for(int i = 1; i < counting.length; i++) {
// ๋์ ํฉ ํด์ฃผ๊ธฐ
counting[i] += counting[i - 1];
}
// ๊ณผ์ 3
for(int i = array.length - 1; i >= 0; i--) {
/*
* i ๋ฒ์จฐ ์์๋ฅผ ์ธ๋ฑ์ค๋ก ํ๋ counting ๋ฐฐ์ด์ 1 ๊ฐ์์ํจ ๋ค
* counting ๋ฐฐ์ด์ ๊ฐ์ ์ธ๋ฑ์ค๋ก ํ์ฌ result์ value ๊ฐ์ ์ ์ฅํ๋ค.
*/
int value = array[i];
counting[value]--;
result[counting[value]] = value;
}
/* ๋น๊ต ์ถ๋ ฅ */
// ์ด๊ธฐ ๋ฐฐ์ด
System.out.println("array[]");
for(int i = 0; i < array.length; i++) {
if(i % 10 == 0) System.out.println();
System.out.print(array[i] + "\t");
}
System.out.println("\n\n");
// Counting ๋ฐฐ์ด
System.out.println("counting[]");
for(int i = 0; i < counting.length; i++) {
if(i % 10 == 0) System.out.println();
System.out.print(counting[i] + "\t");
}
System.out.println("\n\n");
// ์ ๋ ฌ๋ ๋ฐฐ์ด
System.out.println("result[]");
for(int i = 0; i < result.length; i++) {
if(i % 10 == 0) System.out.println();
System.out.print(result[i] + "\t");
}
System.out.println();
}
}
public class counting_sort {
public static void main(String[] args) {
int[] arr = new int[101]; // ์์ ๋ฒ์ : 0 ~ 100
for (int i = 0; i < 50; i++) { // ์์ด์ ํฌ๊ธฐ : 50
arr[(int) (Math.random() * 101)]++; // 0 ~ 100
}
for(int i = 0; i < arr.length; i++) {
while(arr[i]-- > 0) { // arr ๊ฐ์ด 0๋ณดํ ํด ๊ฒฝ์ฐ
System.out.print(i + " ");
}
}
}
}
<์คํ๊ฒฐ๊ณผ>
0 1 6 6 9 10 14 14 16 16 19 21 23 25 25 27 31 36 39 40 40 42 43 46 46 48 49 53 54 55 55 63 66 67 67 68 74 76 76 77 78 79 79 89 91 92 93 96 97 98