CS/Algorithm

๊ณ„์ˆ˜ ์ •๋ ฌ(counting sort)

deo2kim 2020. 9. 26. 22:16
๋ฐ˜์‘ํ˜•

๐Ÿ“” ๊ณ„์ˆ˜ ์ •๋ ฌ(counting sort) ์ด๋ž€

  • ์ž‘์€ ๋ฒ”์œ„ ์กฐ๊ฑด์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ํ•œํ•ด์„œ ๋น ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์‹œ๊ฐ„๋ณต์žก๋„: O(N), ์ตœ์•…์˜ ๊ฒฝ์šฐ O(N^2)
  • ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐฏ์ˆ˜๋งŒ ์„ธ์ฃผ๋ฉด ๋œ๋‹ค. ๋น„๊ต์ •๋ ฌ X

 

๐Ÿ“” ๊ณ„์ˆ˜ ์ •๋ ฌ(counting sort) ๊ตฌํ˜„

N = 5  # 5 ์ดํ•˜์ธ ์ˆ˜๋“ค์„ ์ •๋ ฌํ•ด๋ผ
numbers = [1, 2, 3, 4, 5, 1, 1, 2, 3, 4, 5, 3,
           3, 2, 1, 2, 3, 1, 2, 3, 4, 1, 5, 1,
           2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3,
           4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
print(f'์ •๋ ฌ ์ „: {numbers}')
count_list = [0] * (N + 1)

for number in numbers:
    count_list[number] += 1

sorted_numbers = []
for i in range(len(count_list)):
    for j in range(count_list[i]):
        sorted_numbers.append(i)

print(f'์ •๋ ฌ ํ›„: {sorted_numbers}')

 

๐Ÿ“” ๊ณ„์ˆ˜ ์ •๋ ฌ(counting sort) ํŠน์ง•

  • ์žฅ์ 
    • ํŠน์ • ์กฐ๊ฑด์—์„œ ๋งค์šฐ ๋น ๋ฆ„ O(N)
    •  
    • ์•ˆ์ • ์ •๋ ฌ
  • ๋‹จ์ 
    • ๋ฒ”์œ„๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•˜๋‹ค.
    • ์›๋ž˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N+K) ์—ฌ๊ธฐ์„œ K๋Š” ๋ฒ”์œ„์ค‘ ๊ฐ€์žฅ ํฐ ์ˆ˜
      K๊ฐ€ N๋ณด๋‹ค ์ปค์ง€๊ฒŒ ๋˜๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„ ์ฆ๊ฐ€
      ๋งŒ์•ฝ 10๊ฐœ(N)์˜ ์ˆซ์ž๋ฅผ ๋น„๊ตํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ํฐ์ˆ˜๊ฐ€ 100(K)์ด๋ฉด
      100๊ฐœ๋ฅผ ๋ชจ๋‘ ์ˆœํšŒํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N^2)

 

๋ฐ˜์‘ํ˜•