๐Ÿ’ก Coding Test/Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ •๋ ฌ(Sorting) (1) ์„ ํƒ ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ, ํ€ต ์ •๋ ฌ, ๊ณ„์ˆ˜ ์ •๋ ฌ

soozkim 2023. 5. 30. 17:18
์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ
 

์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ - YES24

๋‚˜๋™๋นˆ ์ €์ž์˜ ์œ ํŠœ๋ธŒ ๋ผ์ด๋ธŒ ๋ฐฉ์†ก https://www.youtube.com/c/dongbinnaIT ์ทจ์ค€์ƒ์ด๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์ž…์‚ฌํ•˜๊ณ  ์‹ถ์€ ์นด์นด์˜ค · ์‚ผ์„ฑ์ „์ž · ๋„ค์ด๋ฒ„ · ๋ผ์ธ!์ทจ์—…์˜ ์„ฑ๊ณต ์—ด์‡ ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐ๋ทฐ์— ์žˆ๋‹ค!IT ์ทจ์ค€์ƒ

www.yes24.com

6์žฅ. ์ •๋ ฌ

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ์š”

- ์ •๋ ฌ(Sorting) : ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ •ํ•œ ๊ธฐ์ค€์— ๋”ฐ๋ผ์„œ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ

- ์ด์ง„ ํƒ์ƒ‰์˜ ์ „์ฒ˜๋ฆฌ ๊ณผ์ •

 

์„ ํƒ ์ •๋ ฌ(Selection Sort)

- ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์ž‘์œ„๋กœ ์žˆ์„ ๋•Œ, ์ด ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ด ๋งจ ์•ž์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ๋ฐ”๊พธ๊ณ , ๊ทธ๋‹ค์Œ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ด ์•ž์—์„œ ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ์™€ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ

์„ ํƒ ์ •๋ ฌ ๊ณผ์ •

Step 0. ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ „์ฒด ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ '0'์„ ์„ ํƒํ•ด ๋งจ ์•ž์˜ '7'๊ณผ ๋ฐ”๊พผ๋‹ค

step 0

Step 1. ์ •๋ ฌ๋œ ์ฒซ ๋ฒˆ์งธ๋Š” ์ œ์™ธํ•˜๊ณ  ์ดํ›„ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ์ธ '1'์„ ์„ ํƒํ•˜์—ฌ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์ค‘ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ '5'์™€ ๋ฐ”๊พผ๋‹ค

step1

Step 2. ์ •๋ ฌ๋œ ์ฒซ ๋ฒˆ์งธ๋Š” ์ œ์™ธํ•˜๊ณ  ์ดํ›„ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ์ธ '1'์„ ์„ ํƒํ•˜์—ฌ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์ค‘ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ '5'์™€ ๋ฐ”๊พผ๋‹ค

step 2

Step 3. ์ •๋ ฌ๋œ ์ฒซ ๋ฒˆ์งธ๋Š” ์ œ์™ธํ•˜๊ณ  ์ดํ›„ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ์ธ '1'์„ ์„ ํƒํ•˜์—ฌ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์ค‘ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ '5'์™€ ๋ฐ”๊พผ๋‹ค

step 3

-- ์ค‘๋žต --

Step 8. 

Step 8

Step 9. ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์•ž์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ณผ์ •์„ 9๋ฒˆ ๋ฐ˜๋ณตํ•œ ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€๋งŒํžˆ ๋‘์–ด๋„ ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋‹จ๊ณ„์—์„œ ์ •๋ ฌ์„ ๋งˆ์น  ์ˆ˜ ์žˆ๋‹ค.

Step 9

- ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์•ž์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ณผ์ •์„ N - 1๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด ์ •๋ ฌ์ด ์™„๋ฃŒ๋œ๋‹ค.

array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]

for i in range(len(array)):
	min_index = i # ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ์˜ ์ธ๋ฑ์Šค
    
    for j in range(i + 1, len(array)):
    	if array[min_index] > array[j]:
        	min_index = j
    
    array[i], array[min_index] = array[min_index], array[i]	# ์Šค์™€ํ”„
    
print(array)

# ์ถœ๋ ฅ
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

์Šค์™€ํ”„(Swap)

- ์Šค์™€ํ”„(swap) : ํŠน์ •ํ•œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‘ ๋ณ€์ˆ˜์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธ

# 0 ์ธ๋ฑ์Šค์™€ 1 ์ธ๋ฑ์Šค์˜ ์›์†Œ ๊ต์ฒดํ•˜๊ธฐ
array = [3, 5]
array[0], array[1] = array[1], array[0]

print(array)

# ์ถœ๋ ฅ
# [5, 3]

์„ ํƒ ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

- O(N²) : 2์ค‘ ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ

- ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ 10,000๊ฐœ ์ด์ƒ์ด๋ฉด ์†๋„๊ฐ€ ๋А๋ ค์ง

 

์‚ฝ์ž… ์ •๋ ฌ(Insertion Sort)

- ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉฐ, ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•œ ์œ„์น˜์— ์‚ฝ์ž…ํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ

- ์„ ํƒ ์ •๋ ฌ์— ๋น„ํ•ด ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก๋ฉด์—์„œ ๋” ํšจ์œจ์ ์ด๋‹ค

์‚ฝ์ž… ์ •๋ ฌ ๊ณผ์ •

Step 0. ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ 7์€ ๊ทธ ์ž์ฒด๋กœ ์ •๋ ฌ์ด ๋˜์–ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ์ธ 5๊ฐ€ ์–ด๋–ค ์œ„์น˜๋กœ ๋“ค์–ด๊ฐˆ์ง€ ํŒ๋‹จํ•œ๋‹ค. 7์˜ ์™ผ์ชฝ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๋‘ ๊ฒฝ์šฐ๋งŒ ์กด์žฌํ•œ๋‹ค. ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ•˜๊ณ ์žํ•˜๋ฏ€๋กœ 7์˜ ์™ผ์ชฝ์— ์‚ฝ์ž…ํ•œ๋‹ค.

Step 1. ์ด์–ด์„œ 9๊ฐ€ ์–ด๋–ค ์œ„์น˜์— ๋“ค์–ด๊ฐˆ์ง€ ํŒ๋‹จํ•œ๋‹ค. ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋Š” ์ด 3๊ฐ€์ง€์ด๋ฉฐ ํ˜„์žฌ 9์™€ 5์™€ 7๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์›๋ž˜ ์ž๋ฆฌ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค.

Step 2. ์ด์–ด์„œ 0์ด ์–ด๋–ค ์œ„์น˜์— ๋“ค์–ด๊ฐˆ์ง€ ํŒ๋‹จํ•œ๋‹ค. 0์€ 5, 7, 9์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ๋ฒˆ์งธ ์œ„์น˜์— ์‚ฝ์ž…ํ•œ๋‹ค.

Step 3. ์ด์–ด์„œ 3์ด ์–ด๋–ค ์œ„์น˜์— ๋“ค์–ด๊ฐˆ์ง€ ํŒ๋‹จํ•œ๋‹ค. 0๊ณผ 5 ์‚ฌ์ด์— ์‚ฝ์ž…ํ•œ๋‹ค.

-- ์ค‘๋žต --

Step 7.

Step 8.

Step 9. ์ด์™€ ๊ฐ™์ด ์ ์ ˆํ•œ ์œ„์น˜์— ์‚ฝ์ž…ํ•˜๋Š” ๊ณผ์ •์„ N - 1๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์ •๋ ฌ์ด ์ด๋ฃจ์›Œ์ง„ ์›์†Œ๋Š” ํ•ญ์ƒ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋‹ค

array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]

for i in range(len(array)):
    for j in range(i, 0, -1):	# ์ธ๋ฑ์Šค i๋ถ€ํ„ฐ 1๊นŒ์ง€ ๊ฐ์†Œํ•˜๋ฉฐ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฌธ๋ฒ•
    	if array[j] < array[j - 1]:	# ํ•œ ์นธ์”ฉ ์™ผ์ชฝ์œผ๋กœ ์ด๋™
        	array[j], array[j - 1] = array[j - 1], array[j]
    	else:	# ์ž๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ทธ ์œ„์น˜์—์„œ ๋ฉˆ์ถค
        	break
    
print(array)

# ์ถœ๋ ฅ
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

์‚ฝ์ž… ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

- O(N²) : 2์ค‘ ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ

- ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฑฐ์˜ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ์ตœ์„ ์˜ ๊ฒฝ์šฐ O(N)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ํ€ต ์ •๋ ฌ(Quick Sort)

- ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ ๊ธฐ์ค€๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ์–ด ์ •๋ ฌํ•˜๋Š” ๊ฒƒ

- ํ”ผ๋ฒ—(Pivot) ์‚ฌ์šฉ : ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ค€์„ ํ‘œํ˜„. ๋ฆฌ์ŠคํŠธ์—์„œ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์ •ํ•œ๋‹ค

ํ€ต ์ •๋ ฌ ๊ณผ์ •

์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ

< ํŒŒํŠธ 1 >

Step 0. ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์„ค์ •ํ•˜๋ฏ€๋กœ ํ”ผ๋ฒ—์€ 5์ด๋‹ค. ์ดํ›„์— ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ 5๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๋ฏ€๋กœ 7์ด ์„ ํƒ๋˜๊ณ , ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ 5๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๋ฏ€๋กœ 4๊ฐ€ ์„ ํƒ๋œ๋‹ค. ๋‘ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

Step 1. ๊ทธ ๋‹ค์Œ ๋‹ค์‹œ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๊ฐ ์ฐพ๋Š”๋‹ค. ์ฐพ์€ ๋’ค์—๋Š” ๋‘ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ, ํ˜„์žฌ 9์™€ 2๊ฐ€ ์„ ํƒ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด ๋‘ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

Step 2. ๊ทธ ๋‹ค์Œ ๋‹ค์‹œ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๊ฐ ์ฐพ๋Š”๋‹ค. ๋‹จ ํ˜„์žฌ ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ฐพ๋Š” ๊ฐ’๊ณผ ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ฐพ๋Š” ๊ฐ’์˜ ์œ„์น˜๊ฐ€ ์„œ๋กœ ์—‡๊ฐˆ๋ฆฐ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ’์ด ์—‡๊ฐˆ๋ฆฐ ๊ฒฝ์šฐ์—๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ์ฆ‰, ์ž‘์€ ๋ฐ์ดํ„ฐ์ธ 1๊ณผ ํ”ผ๋ฒ—์ธ 5์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ถ„ํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Step 3. ๋ถ„ํ•  ์™„๋ฃŒ

์ด์™€ ๊ฐ™์ด ํ”ผ๋ฒ—์ด ์ด๋™ํ•œ ์ƒํƒœ์—์„œ 5์˜ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ 5๋ณด๋‹ค ์ž‘๊ณ , ์˜ค๋ฅธ์ชฝ์€ ๋ชจ๋‘ 5๋ณด๋‹ค ํฌ๋‹ค. ์ด๋ ‡๊ฒŒ ํ”ผ๋ฒ—์˜ ์™ผ์ชฝ์—๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ํ•˜๊ณ , ํ”ผ๋ฒ—์˜ ์˜ค๋ฅธ์ชฝ์—๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ํ•˜๋„๋ก ํ•˜๋Š” ์ž‘์—…์„ ๋ถ„ํ• (Divide) ํ˜น์€ ํŒŒํ‹ฐ์…˜(Partition)์ด๋ผ๊ณ  ํ•œ๋‹ค.

< ํŒŒํŠธ 2 >

์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ์—์„œ ์œ„์™€ ๊ฐ™์€ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•œ๋‹ค.

< ํŒŒํŠธ 3 >

์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ์—์„œ ์œ„์™€ ๊ฐ™์€ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•œ๋‹ค.

- ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ–ˆ์„ ๋•Œ, ๊ตฌํ˜„์ด ๋งค์šฐ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค. ํ€ต ์ •๋ ฌ์ด ๋๋‚˜๋Š” ์กฐ๊ฑด์€ ํ˜„์žฌ ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ 1์ธ ๊ฒฝ์šฐ์ด๋‹ค.

array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array, start, end):
    if start >= end:    # ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ
        return
    pivot = start       # ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    left = start + 1
    right = end
    while left <= right:
        # ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while left <= end and array[left] <= array[pivot]:
            left += 1
        # ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while right > start and array[right] >= array[pivot]:
            right -= 1
        if left > right:    # ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—์„ ๊ต์ฒด
            array[right], array[pivot] = array[pivot], array[right]
        else:               # ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต์ฒด
            array[left], array[right] = array[right], array[left]
    # ๋ถ„ํ•  ์ดํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๊ฐ๊ฐ ์ •๋ ฌ ์ˆ˜ํ–‰
    quick_sort(array, start, right - 1)
    quick_sort(array, right + 1, end)

quick_sort(array, 0, len(array) - 1)
print(array)

# ์ถœ๋ ฅ
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

- ํŒŒ์ด์ฌ์˜ ์žฅ์ ์„ ์‚ด๋ฆฐ ํ€ต ์ •๋ ฌ ์†Œ์Šค์ฝ”๋“œ

array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array):
    # ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•˜๋‚˜ ์ดํ•˜์˜ ์›์†Œ๋งŒ์„ ๋‹ด๊ณ  ์žˆ๋‹ค๋ฉด ์ข…๋ฃŒ
    if len(array) <= 1:
        return array
    
    pivot = array[0]    # ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    tail = array[1:]    # ํ”ผ๋ฒ—์„ ์ œ์™ธํ•œ ๋ฆฌ์ŠคํŠธ
    
    left_side = [x for x in tail if x <= pivot] # ๋ถ„ํ• ๋œ ์™ผ์ชฝ ๋ถ€๋ถ„
    right_side = [x for x in tail if x > pivot] # ๋ถ„ํ• ๋œ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„
    
    # ๋ถ„ํ•  ์ดํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๊ฐ๊ฐ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜
    return quick_sort(left_side) + [pivot] + quick_sort(right_side)

print(quick_sort(array))

# ์ถœ๋ ฅ
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

ํ€ต ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

- ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(NlogN), ์ตœ์•…์˜ ๊ฒฝ์šฐ๋Š” O(N²)

- ์ด๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋งค์šฐ ๋А๋ฆฌ๊ฒŒ ๋™์ž‘ํ•œ๋‹ค

 

๊ณ„์ˆ˜ ์ •๋ ฌ(Count Sort)

- ํŠน์ •ํ•œ ์กฐ๊ฑด์ด ๋ถ€ํ•ฉํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค์šฐ ๋น ๋ฅธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ์ˆ˜ํ–‰์‹œ๊ฐ„ O(๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜ + ๋ฐ์ดํ„ฐ์˜ ์ตœ๋Œ“๊ฐ’) ์„ ๋ณด์žฅํ•œ๋‹ค.

- ํŠน์ •ํ•œ ์กฐ๊ฑด : ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋˜์–ด ์ •์ˆ˜ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ

๊ณ„์ˆ˜ ์ •๋ ฌ ๊ณผ์ •

- ๋ณ„๋„์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ทธ ์•ˆ์— ์ •๋ ฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค. ์ฒ˜์Œ์—๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ 0์ด ๋˜๋„๋ก ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

Step 0. ์ดˆ๊ธฐ ๋‹จ๊ณ„ : 7 5 9 0 3 1 6 2 9 1 4 8 0 5 2

Step 1. 7 5 9 0 3 1 6 2 9 1 4 8 0 5 2

0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 1 0 0

Step 2. 7 5 9 0 3 1 6 2 9 1 4 8 0 5 2

0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 1 0 1 0 0

Step 3. 7 5 9 0 3 1 6 2 9 1 4 8 0 5 2

0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 1 0 1 0 1

-- ๊ณผ์ • ๋ฐ˜๋ณต --

Step 14. 7 5 9 0 3 1 6 2 9 1 4 8 0 5 2

0 1 2 3 4 5 6 7 8 9
0 2 1 1 1 2 1 1 1 2

Step 2. 7 5 9 0 3 1 6 2 9 1 4 8 0 5 2

0 1 2 3 4 5 6 7 8 9
2 2 2 1 1 2 1 1 1 2

- ๊ฒฐ๊ณผ์ ์œผ๋กœ ์œ„์™€ ๊ฐ™์ด ๋ฆฌ์ŠคํŠธ์—๋Š” ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡ ๋ฒˆ ๋“ฑ์žฅํ–ˆ๋Š”์ง€ ๊ทธ ํšŸ์ˆ˜๊ฐ€ ๊ธฐ๋ก๋œ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๊ทธ ๊ฐ’๋งŒํผ ์ธ๋ฑ์Šค๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

--> 0 0 1 1 2 2 3 4 5 5 6 7 8 9 9

# ๋ชจ๋“  ์›์†Œ์˜ ๊ฐ’์ด 0 ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •
array = [7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2]

# ๋ชจ๋“  ๋ฒ”์œ„๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฆฌ์ŠคํŠธ ์„ ์–ธ(๋ชจ๋“  ๊ฐ’์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”)
count = [0] * (max(array) + 1)

for i in range(len(array)):
    count[array[i]] += 1    # ๊ฐ ๋ฐ์ดํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค์˜ ๊ฐ’ ์ฆ๊ฐ€
    

for i in range(len(count)): # ๋ฆฌ์ŠคํŠธ์— ๊ธฐ๋ก๋œ ์ •๋ ฌ ์ •๋ณด ํ™•์ธ
    for j in range(count[i]):
        print(i, end=' ')   # ๋„์–ด์“ฐ๊ธฐ๋ฅผ ๊ตฌ๋ถ„์œผ๋กœ ๋“ฑ์žฅํ•œ ํšŸ์ˆ˜๋งŒํผ ์ธ๋ฑ์Šค ์ถœ๋ ฅ
        
# ์ถœ๋ ฅ
# 0 0 1 1 2 2 3 4 5 5 6 7 8 9 9

๊ณ„์ˆ˜ ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ๊ณต๊ฐ„ ๋ณต์žก๋„

๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์–‘์˜ ์ •์ˆ˜์ธ ์ƒํ™ฉ์—์„œ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ N, ๋ฐ์ดํ„ฐ ์ค‘ ์ตœ๋Œ“๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ K๋ผ๊ณ  ํ•  ๋•Œ

- ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N + K)

- ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(N + K)

728x90