์๋ ํ์ธ์, ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ฆฌํ๋ ํฌ์คํ ์ ๋๋ค. ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฐธ๊ณ ํ์๋ ค๋ฉด ํด๋น ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ด์ฉํด์ฃผ์ธ์. ๐
๊ณ์ ์ ๋ ฌ (Counting Sort)
์นด์ดํ ์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋๊ฐ ๐ถ(๐) ์ผ๋ก ์๋๊ฐ ๋น ๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํต ์ ๋ ฌ(Quick Sort), ํฉ๋ณ ์ ๋ ฌ(Merge Sort) ์ ํ๊ท ์๊ฐ๋ณต์ก๋๋ ๐ถ(nlogn) ์ธ๋ฐ ์นด์ดํ ์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋๊ฐ ๐ถ(๐) ์ผ๋ก ์๋๊ฐ ์์ฃผ ์ฐ์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์นด์ดํ ์ ๋ ฌ์ ์ฝ๋๋ก ํ๋ํ๋ ๋ฏ์ด์ ๋ณด์.
๋จผ์ , ๋ฐฐ์ด์ ์ธ๊ฐ์ง๋ฅผ ์ ์ธ ํด์ค๋ค.
int[] array = new int[100]; //์์ด์ ์์ : 100๊ฐ
int[] counting = new int[101]; //์์ ๋ฒ์ : 0~100
int[] sorted = new int[100]; //์ ๋ ฌ ๋ ๋ฐฐ์ด
arr ๋ฐฐ์ด์ ๊ฐ๊ฐ ๋ด๊ฒจ ์๋ ๊ฐ์ counting ๋ฐฐ์ด์ ์ธ๋ฑ์ค์ ํด๋นํ๋ ๊ฐ์ ์ฆ๊ฐ ์์ผ ์ค๋ค.
๊ทธ๋ฅ ๋ง๊ทธ๋๋ก ํด๋น ์ซ์์ผ๋, counting ์์๊ฐ์ ์ฆ๊ฐ ์์ผ ์ฃผ๋ ๊ฒ์ด๋ค. (์๋ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ์.)
for(int i=0; i<arr.length; i++) {
counting[ arr[i] ]++;
}
counting์ ๊ฐ ์์์ ๊ฐ์ arr๊ฐ์ด ์ ๋ ฌ๋์ sorted ๋ฐฐ์ด์ ๋ค์ด๊ฐ ์ธ๋ฑ์ค ๊ฐ์ด ๋๋ค.
๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ํ์๋ฉด,
counting ์ ๊ฐ ์์์ ๊ฐ์ counting[i] = counting[i] + counting[i-1]; ๋ก ๋ํ๋ธ๋ค.
์ฝ๋๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
for(int i=1; i<counting.length; i++) {
counting[i] += counting[i-1];
}
์์์ ํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด, arr๊ฐ์ ํด๋นํ๋ counting์ ์์๊ฐ์ sorted์ ์ธ๋ฑ์ค๊ฐ ๋๋ค.
arr[i]์ ๊ฐ์ด counting์ index๊ฐ์ด๊ณ , counting์ ๊ฐ์ -1 ์ํจ ๊ฐ์ sorted์ index๋ก ์ฌ์ฉํด ํด๋น index ๊ฐ์ arr[i] ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. ์ฝ๋๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
for (int i = array.length - 1; i >= 0; i--) {
int value = array[i];
counting[value]--;
result[counting[value]] = value;
}
์ด์ ์ถ๋ ฅ์ ํด๋ณด๋ฉด,
1 2 3 4 5
์์๋๋ก ์ ๋ ฌ์ด ๋ ๊ฒ์ ๋ณผ ์๊ฐ ์๋ค.
๋ง์ฝ ์์ ๋ฒ์๋ฅผ ์๊ณ ์๊ณ , ์ถ๋ ฅ๋ง ํ๋ฉด ๋๋ค๋ฉด ์ ๋ฐฉ๋ฒ ๋ณด๋ค, ๋ ๊ฐ๋จํ ์ฝ๋๊ฐ ์๋ค.
public class Counting_Sort {
public static void main(String[] args) {
int[] arr = new int[10]; // ํฌ๊ธฐ๋ฅผ 10์ผ๋ก ์ ํ๋ค๋ฉด, ์์ ๋ฒ์๋ 0~10๊น์ง ์ ํํด์ผํ๋ค.
for (int i = 0; i < arr.length; i++) {
arr[(int)(Math.random() * 11)]++; // Math.random() * 11 ๋ก ๋ฒ์๋ฅผ ์ ํ ์์ผฐ๋ค.
}
for (int i = 0; i < arr.length; i++) {
while (arr[i] > 0) {
System.out.print(i + " ");
arr[i]--;
}
}
}
}
์ ๋ ฅ ๋ฐ์ (๋๋ค์ผ๋ก ์ฃผ์ด์ง๋) ์์ ํด๋นํ๋ ์ธ๋ฑ์ค์ ๊ฐ์ ์ฆ๊ฐ์ํค๊ณ , while๋ฌธ์ผ๋ก ํตํด ์ธ๋ฑ์ค๊ฐ 1์ด์์ธ ์ธ๋ฑ์ค๋ฅผ ์ถ๋ ฅ์์ผ์ฃผ๋ ๊ฐ๋จํ ๋งค์ปค๋์ฆ์ด๋ค.
์ค๋ Counting Sort ๋ฅผ ์์๋ณด์๋๋ฐ, ์ฑ๋ฅ์ด ํ์ ์์ฃผ ์ฌ์ฉํ๋ ํต ์ ๋ ฌ(Quick Sort) ๋ณด๋ค ํจ์ฌ ๋ฐ์ด๋๊ณ , ์ฝ๋๋ ๊ทธ๋ฆฌ ๋ณต์กํ์ง ์์์ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ๊ฐ์ ์๊ฐ์ด๊ณผ๊ฐ ๋์ง ์๊ฒ ํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ๋๊ผ๋ค.
์ฐธ๊ณ : st-lab.tistory.com/104?category=856997