์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•˜์—ฌ

2020. 8. 26. 18:01ใ†์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค/์ •๋ ฌ

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•˜์—ฌ

 

 

์ •๋ ฌ

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

๋ฌธ์ œ๋ฅผ ํ’€๊ฑฐ๋‚˜, ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ "์ˆ˜ํ–‰์‹œ๊ฐ„"์ด๋‹ค. ์ด ์ˆ˜ํ–‰์‹œ๊ฐ„์€ ์ƒํ™ฉ์— ๋งž๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ค„์–ด๋“ ๋‹ค. ์ด์— ์žˆ์–ด "์ •๋ ฌ"์€ ์•„์ฃผ ์ค‘์š”ํ•œ ์š”์†Œ๊ฐ€ ๋œ๋‹ค.

 

 

์ด ๊ธ€์—์„œ๋Š” ๋Œ€ํ‘œ์ ์ธ ์ •๋ ฌ 3๊ฐ€์ง€. ์„ ํƒ ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ, ํ€ต ์ •๋ ฌ๋งŒ์„ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

 

์„ ํƒ ์ •๋ ฌ

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

 

๋ฐ”๋กœ ์˜ˆ์‹œ๋กœ ๋„˜์–ด๊ฐ€๋ณด์ž.

a = [3, 7, 0, 6] ๋ผ๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

1. 0์„ ์„ ํƒํ•ด์„œ 3๊ณผ ๋ฐ”๊พผ๋‹ค -> [0, 7, 3 ,6]

2. 3์„ ์„ ํƒํ•ด์„œ 7๊ณผ ๋ฐ”๊พผ๋‹ค -> [0, 3, 7, 6]

3. 7์„ ์„ ํƒํ•ด์„œ 6๊ณผ ๋ฐ”๊พผ๋‹ค -> [0, 3, 6, 7]

 

์ด์™€๊ฐ™์ด n๊ฐœ์˜ ์ˆ˜๊ฐ€ ์žˆ์„ ๋•Œ n + n-1 + n-2---- +2๊ฐ€ ๋˜๊ณ , ์ด๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„ O(N^2)๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ 100๊ฐœ๋ผ๋ฉด ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ 10,000๋ฐฐ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์ด๋‹ค. ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ๋Š” ์‰ฝ์ง€๋งŒ, ์ƒ๋‹นํžˆ ๋น„ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

์„ ํƒ ์ •๋ ฌ ์†Œ์Šค์ฝ”๋“œ

array = [0,5,2,7,4]

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)

 

 

 

์‚ฝ์ž… ์ •๋ ฌ

-ํŠน์ •ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•œ ์œ„์น˜์— '์‚ฝ์ž…'ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

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

-์ •๋ ฌ์ด ๋˜์–ด์žˆ์„ ๋•Œ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N)์ด๋‹ค.

-์‚ฝ์ž…์ •๋ ฌ์—์„œ ์ฒซ๋ฒˆ์งธ๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘๋ฒˆ์งธ๋ถ€ํ„ฐ ์‹œ์ž‘.

 

์˜ˆ์‹œ

a = [7 5 9 3]

1. 5๋Š” 7๋ณด๋‹ค ์ž‘๊ธฐ์— ๋‘˜์„ swapํ•œ๋‹ค.-->[5 7 9 3]

2. 9๋Š” 7๋ณด๋‹ค ํฌ๊ฒŒ์— ๊ฐ€๋งŒํžˆ ๋‘”๋‹ค.

3. 3์€ 9๋ถ€ํ„ฐ ์ž‘๊ธฐ์— swap ํ•œ๋‹ค--> [5 7 3 9] --> ์ด๋ฅผ ํ•œ ๋ฒˆ ๋” ์ˆ˜ํ–‰ํ•œ๋‹ค -->[5 3 7 9] --> ํ•œ ๋ฒˆ ๋” ์ˆ˜ํ–‰ -->[3 5 7 9]

 

j๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์ˆ˜๋ผ๊ณ  ๋†“์•˜์„ ๋•Œ, j-1๋ณด๋‹ค ์ž‘๋‹ค๋ฉด swap์„ ์ง„ํ–‰ํ•˜๊ณ  ํฌ๋‹ค๋ฉด break๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์‚ฝ์ž… ์ •๋ ฌ ์†Œ์Šค์ฝ”๋“œ

array = [1,4,2,5,3,8]

for i in range(1,len(array)):
  for j in range(i, 0, -1):
    if array[j] < array[j-1] :
      array[j], array[j-1] = array[j-1], array[j]
    else :
      break
      
print(array)

 

ํ€ต ์ •๋ ฌ

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

 

์ด ๊ธ€์—์„œ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ถ„ํ•  ๋ฐฉ์‹์œผ๋กœ ํ€ต ์ •๋ ฌ์„ ์†Œ๊ฐœํ•  ๊ฒƒ์ด๋‹ค. ๋ฐฉ๋ฒ•์„ ์ฒœ์ฒœํžˆ ์‚ดํŽด๋ณด์ž

1. ํ”ผ๋ฒ—(๋ฆฌ์ŠคํŠธ์˜ ์ฒซ๋ฒˆ์งธ ์ˆซ์ž)๋ฅผ ์„ค์ •ํ•œ๋‹ค.

2. ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ณ , ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š”๋‹ค. ์ด๋ฅผ swapํ•ด์ค€๋‹ค. 

3. ์™ผ์ชฝ์—์„œ ์ฐพ๋Š” ๊ฐ’์ด ์˜ค๋ฅธ์ชฝ์—์„œ ์ฐพ๋Š”๊ฐ’๊ณผ ์—‡๊ฐˆ๋ ธ์„ ๋•Œ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๊ฐ’์„ ํ”ผ๋ฒ—๊ณผ ๋ฐ”๊ฟ”์ค€๋‹ค๋ฉด ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์€ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค, ์˜ค๋ฅธ์ชฝ์€ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’๋“ค๋กœ ์ •๋ ฌ์ด ๋œ๋‹ค.

 

ํ€ต ์ •๋ ฌ ์†Œ์Šค์ฝ”๋“œ

array = [3,4,1,5,2,3,5,7]

def quick_sort(array, start, end):
  if start >=end:
    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[pivot], array[right] = array[right], array[pivot]
    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)

ํŒŒ์ด์ฌ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•œ ํ€ต ์ •๋ ฌ ๋˜ํ•œ ์กด์žฌํ•œ๋‹ค. ์ด๋Š” ๊ธฐ์กด์˜ ํ€ต ์ •๋ ฌ๋ณด๋‹ค๋Š” ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ๋งŽ์ง€๋งŒ ์ง๊ด€์ ์ด๊ณ  ๊ตฌํ˜„๊ฐ€๊ธฐ๊ฐ€ ์‰ฝ๋‹ค. 

 

ํŒŒ์ด์ฌ ์ „์šฉ ์†Œ์Šค์ฝ”๋“œ

 

array = [2,3,1,4,9]

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_sort)
  
  print(quick_sort(array))

ํ€ต ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” N๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, N๋ฒˆ๋™์•ˆ ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊พธ๊ณ  ์ด๋ฅผ ๋ถ„ํ•  logN๋ฒˆ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ํ€ต ์ •๋ ฌ์€ N X logN์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ์ด๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋„“์ด๋กœ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, N๊ฐœ๊ฐ€ ๊ฐ€๋กœ, logN์ด ์„ธ๋กœ๋ผ๊ณ  ๋ดค์„ ๋•Œ ๋‘๊ฐœ๊ฐ€ ๊ณฑํ•œ ๊ฒƒ๋งŒํผ ์—ฐ์‚ฐํšŸ์ˆ˜๊ฐ€ ์ƒ๊ธด๋‹ค. ์ด๋Š” ์„ ํƒ์ •๋ ฌ๊ณผ ์‚ฝ์ž…์ •๋ ฌ์— ๋น„ํ•ด ๊ทน๋ช…ํ•œ ์†๋„์ฐจ์ด๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ€ต ์ •๋ ฌ์€ ํ‰๊ท ์ ์œผ๋กœ O(NlogN)์„ ๋”ฐ๋ฅด์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋งค์šฐ ๋Š๋ฆฌ๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ”๊พธ์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ˆ˜๋ฅผ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Š” ์„ ํƒ์ •๋ ฌ๊ณผ ๊ฐ™์ด O(N^2)์ธ ๊ฒฝ์šฐ์ด๋‹ค.