๋ฐ˜๊ฐ€์›Œ์š”! ํ—ˆ๋ธŒ์ž…๋‹ˆ๋‹ค!

์ €๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ํ˜„๋Œ€ ์—ฐ๊ธˆ์ˆ ์‚ฌ๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋Š๋‚€ ์ ๋“ค๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ

[์ž๋ฃŒ๊ตฌ์กฐ] counting sort ๊ณ„์ˆ˜์ •๋ ฌ

mmin.h 2020. 8. 18. 09:54

์•ˆ๋…•ํ•˜์„ธ์š” ์ฃผ์ธ์žฅ H์ž…๋‹ˆ๋‹ค. 

์ง€๊ธˆ๊นŒ์ง€ ์„ ํƒ, ๋ฒ„๋ธ”, ์‚ฝ์ž…, ํ€ต, ๋ณ‘ํ•ฉ, ํž™ ์ •๋ ฌ์˜ ๊ฐœ๋…์„ ๊ณต๋ถ€ํ•ด๋ณด์•˜๊ณ , 

๊ฐ€์žฅ ๋นผ์šด ์ •๋ ฌ์€ O(N * log N)์ด ๋‚˜์˜ค๋Š” ํ€ต, ๋ณ‘ํ•ฉ, ํž™ ์ •๋ ฌ ์ด์˜€์Šต๋‹ˆ๋‹ค. 

ํ•˜์ง€๋งŒ ์ด๋ณด๋‹ค ๋”์šฑ ๋น ๋ฅธ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š” 

 

๋‹ค์Œ์˜ 3 ์ดํ•˜์˜ ๋ฐ์ดํ„ฐ ์ž์—ฐ์ˆ˜๋“ค์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ฆฌํ•˜์„ธ์š” 

1 3 2 3 1 2 3 2 1 3

 

10๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ 3์•ˆ์— ์žˆ๋Š”๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. ์ด์ฒ˜๋Ÿผ ๋ฒ”์œ„์กฐ๊ฑด์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ํ•œํ•ด 

๊ต‰์žฅํžˆ ๋น ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž…๋‹ˆ๋‹ค. ์†๋„๋Š” O(N)์ž…๋‹ˆ๋‹ค. 

 

๊ณ„์ˆ˜์ •๋ ฌ์€ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ๋ฉด ์–ด๋–จ๊นŒ? ๋ž€ ๋ฐœ์ƒ์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

์ฆ‰ ์„ธ๊ฐœ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  1์ด๋ฉด arr[0]++ 3์ด๋ฉด arr[2]++ ์ด๋Ÿฐ์‹์œผ๋กœ ์ˆซ์ž๋ฅผ ์„ธ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

๊ทธ๋Ÿฌ๋ฉด ์ˆซ์ž์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์„ธ์งˆํ…Œ๊ณ  

1์„ arr[0]์˜ ๊ฐ’๋งŒํผ, 2๋ฅผ arr[1]์˜ ๊ฐ’๋งŒํผ ๋ฐ˜๋ณตํ•ด์„œ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋˜๊ฒ ์ง€์š”. 

 

//๋ฒ”์œ„์กฐ๊ฑด์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ํ•œํ•ด์„œ ๋น ๋ฅธ ์ •๋ ฌ 
//ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ๋ฉด ์–ด๋–จ๊นŒ? 
//์œ„์น˜ ๋ฐ”๊ฟ€ ํ•„์š” ์—†์Œ O(N)

#include <stdio.h>

int main(void) {
	int temp;
	int count[5];
	int array[30] = { 1,3,2,4,3,2,5,3,1,2,
					1,3,2,4,3,2,5,3,1,2,
					1,3,2,4,3,2,5,3,1,2 };
	//count 0์œผ๋กœ ์ดˆ๊ธฐํ™” 
	for (int i = 0; i < sizeof(count) / sizeof(int); i++) {
		count[i] = 0;
	}
	//count ์— array index์•ˆ์— ์žˆ๋Š” ๊ฐ’์— ๋งž๊ฒŒ ์•Œ๋งž์€ count index ์— ๋„ฃ์–ด์คŒ 
	for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
		count[array[i] - 1]++;
	}
	//count[i]์— ์žˆ๋Š” ๊ฐ’์„ ๊ฐ’๋งŒ๋ฒˆ ์ถœ๋ ฅํ•œ๋‹ค. 
	for (int i = 0; i < sizeof(count) / sizeof(int); i++) {
		if (count[i] != 0) {
			for (int j = 0; j < count[i]; j++) {
				printf("%d ", i + 1);
			}
		}
	}
	return 0;
}