๐Ÿถ Programming/Algorithm

3. Sort ์ •๋ ฌ

์ง€ ์› 2022. 10. 2. 12:15

์ •๋ ฌ

์ •๋ ฌ

2๊ฐœ ์ด์ƒ์˜ ์ž๋ฃŒ๋ฅผ ํŠน์ • ๊ธฐ์ค€์— ์˜ํ•ด ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ํฐ ๊ฐ’(์˜ค๋ฆ„์ฐจ์ˆœ : ascending), ํ˜น์€ ๊ทธ ๋ฐ˜๋Œ€์˜ ์ˆœ์„œ๋Œ€๋กœ(๋‚ด๋ฆผ์ฐจ์ˆœ : dexending) ์žฌ๋ฐฐ์—ด ํ•˜๋Š” ๊ฒƒ

ํ‚ค : ์ž๋ฃŒ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ธฐ์ค€์ด ๋˜๋Š” ํŠน์ • ๊ฐ’

 

์ •๋ ฌ์˜ ์ข…๋ฅ˜

  • ๋ฒ„๋ธ” ์ •๋ ฌ
  • ์นด์šดํŒ… ์ •๋ ฌ
  • ์„ ํƒ ์ •๋ ฌ
  • ํ€ต ์ •๋ ฌ
  • ์‚ฝ์ž… ์ •๋ ฌ
  • ๋ณ‘ํ•ฉ ์ •๋ ฌ

 

๋ฒ„๋ธ” ์ •๋ ฌ(Bubble Sort)

์ธ์ ‘ํ•œ ๋‘ ๊ฐœ์˜ ์›์†Œ๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์ž๋ฆฌ๋ฅผ ๊ณ„์† ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹

 

์ •๋ ฌ๊ณผ์ •

  • ์ฒซ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์ธ์ ‘ํ•œ ์›์†Œ๋ผ๋ฆฌ ๊ณ„์† ์ž๋ฆฌ๋ฅผ ๊ตํ™˜ํ•˜๋ฉด์„œ ๋งจ ๋งˆ์ง€๋ง‰ ์ž๋ฆฌ๊นŒ์ง€ ์ด๋™ํ•œ๋‹ค.
  • ํ•œ ๋‹จ๊ณ„๊ฐ€ ๋๋‚˜๋ฉด ๊ฐ€์žฅ ํฐ ์›์†Œ๊ฐ€ ๋งˆ์ง€๋ง‰ ์ž๋ฆฌ๋กœ ์ •๋ ฌ๋œ๋‹ค.
  • ๊ตํ™˜ํ•˜๋ฉฐ ์ž๋ฆฌ๋ฅผ ์ด๋™ํ•˜๋Š” ๋ชจ์Šต์ด ๋ฌผ ์œ„์— ์˜ฌ๋ผ์˜ค๋Š” ๊ฑฐํ’ˆ ๋ชจ์–‘๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•˜์—ฌ ๋ฒ„๋ธ” ์ •๋ ฌ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์‹œ๊ฐ„๋ณต์žก๋„

O(n²)

 

๋ฐฐ์—ด์„ ํ™œ์šฉํ•œ ๋ฒ„๋ธ” ์ •๋ ฌ

def BubbleSort(a, N): # ์ •๋ ฌํ•  List, N ์›์†Œ ์ˆ˜
    for i in range(N-1, 0, -1): # ์ ์œ„์˜ ๋ ์œ„์น˜
        for j in range(0, i):
            if a[j] > a[j + 1]:
                a[j], a[j + 1] = a[j + 1], a[j]

 

์นด์šดํŒ… ์ •๋ ฌ(Counting Sort)

ํ•ญ๋ชฉ๋“ค์˜ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ง‘ํ•ฉ์— ๊ฐ ํ•ญ๋ชฉ์ด ๋ช‡ ๊ฐœ์”ฉ ์žˆ๋Š”์ง€ ์„ธ๋Š” ์ž‘์—…์„ ํ•˜์—ฌ, ์„ ํ˜• ์‹œ๊ฐ„์— ์ •๋ ฌํ•˜๋Š” ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

์ •๋ ฌ๊ณผ์ •

  • Data์—์„œ ๊ฐ ํ•ญ๋ชฉ๋“ค์˜ ๋ฐœ์ƒ ํšŒ์ˆ˜๋ฅผ ์„ธ๊ณ , ์ •์ˆ˜ ํ•ญ๋ชฉ๋“ค๋กœ ์ง์ ‘ ์ธ๋ฑ์Šค ๋˜๋Š” ์นด์šดํŠธ ๋ฐฐ์—ด counts์— ์ €์žฅํ•œ๋‹ค.
  • ์ •๋ ฌ๋œ ์ง‘ํ•ฉ์—์„œ ๊ฐ ํ•ญ๋ชฉ์˜ ์•ž์— ์œ„์น˜ํ•  ํ•ญ๋ชฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด counts์˜ ์›์†Œ๋ฅผ ์กฐ์ •ํ•œ๋‹ค.
  • counts[a] ๊ฐ์†Œ, temp์— a ์‚ฝ์ž… , ๋ฐ˜๋ณต

 

์‹œ๊ฐ„๋ณต์žก๋„

O(n + k)

: n์€ ๋ฆฌ์ŠคํŠธ ๊ธธ์ด, k๋Š” ์ •์ˆ˜์˜ ์ตœ๋Œ€๊ฐ’

 

์ œํ•œ์‚ฌํ•ญ

  • ์ •์ˆ˜๋‚˜ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ์— ๋Œ€ํ•ด์„œ๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ
    • ๊ฐ ํ•ญ๋ชฉ์˜ ๋ฐœ์ƒ ํšŒ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด, ์ •์ˆ˜ ํ•ญ๋ชฉ์œผ๋กœ ์ธ๋ฑ์Šค ๋˜๋Š” ์นด์šดํŠธ๋“ค์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์นด์šดํŠธ๋“ค์„ ์œ„ํ•œ ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•˜๋ ค๋ฉด ์ง‘ํ•ฉ ๋‚ด์˜ ๊ฐ€์žฅ ํฐ ์ •์ˆ˜๋ฅผ ์•Œ์•„์•ผํ•œ๋‹ค.

 

์นด์šดํŒ… ์ •๋ ฌ ๊ตฌํ˜„

def Counting_Sort(A, B, k):
# A[] - ์ž…๋ ฅ ๋ฐฐ์—ด (1 to k)
# B[] - ์ •๋ ฌ๋œ ๋ฐฐ์—ด
# C[] - ์นด์šดํŠธ ๋ฐฐ์—ด

    C = [0] * (k + 1)

    for i in range(0, len(A)):
        C[A[i]] += 1

    for i in range(0, len(C)):
        C[i] += C[i - 1]

    for i in range(len(B) - 1, -1, -1):
        C[A[i]] -= 1
        B[C[A[i]]] = A[i]

 

์…€๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Selection Algorithm)

์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ž๋ฃŒ๋กœ๋ถ€ํ„ฐ k๋ฒˆ์งธ๋กœ ํฐ ํ˜น์€ ์ž‘์€ ์›์†Œ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ์…€๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ํ•œ๋‹ค.

์ตœ์†Œ๊ฐ’, ์ตœ๋Œ€๊ฐ’ ํ˜น์€ ์ค‘๊ฐ„๊ฐ’์„ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

์„ ํƒ๊ณผ์ •

์…€๋ ‰์…˜์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ณผ์ •์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค.

  • ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ์ž๋ฃŒ ์ •๋ ฌํ•˜๊ธฐ
  • ์›ํ•˜๋Š” ์ˆœ์„œ์— ์žˆ๋Š” ์›์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ

 

K๋ฒˆ์งธ๋กœ ์ž‘์€ ์›์†Œ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

1๋ฒˆ๋ถ€ํ„ฐ k๋ฒˆ์งธ๊นŒ์ง€ ์ž‘์€ ์›์†Œ๋“ค์„ ์ฐพ์•„ ๋ฐฐ์—ด์˜ ์•ž์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๊ณ , ๋ฐฐ์—ด์˜ k๋ฒˆ์งธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

k๊ฐ€ ๋น„๊ต์  ์ž‘์„ ๋•Œ ์œ ์šฉํ•˜๋ฉฐ O(kn)์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ํ•„์š”๋กœ ํ•œ๋‹ค.

def select(arr, k):
    for i in range(0, k):
        minIndex = i
        for j in range(i+1, len(arr)):
            if arr[minIndex] > arr[j]:
                minIndex = j
        arr[i], arr[minIndex] = arr[minIndex], arr[i]
    return arr[k-1]

์‹œ๊ฐ„๋ณต์žก๋„

O(n²)

 

์„ ํƒ์ •๋ ฌ

์ฃผ์–ด์ง„ ์ž๋ฃŒ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์„ ํƒํ•˜์—ฌ ์œ„์น˜๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹

์•ž์„œ ์‚ดํŽด๋ณธ ์…€๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ „์ฒด ์ž๋ฃŒ์— ์ ์šฉํ•œ ๊ฒƒ.

 

์ •๋ ฌ๊ณผ์ •

  • ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ ์ค‘์—์„œ ์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
  • ๊ทธ ๊ฐ’์„ ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž์— ์œ„์น˜ํ•œ ๊ฐ’๊ณผ ๊ตํ™˜ํ•œ๋‹ค.
  • ๋งจ ์ฒ˜์Œ ์œ„์น˜๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ๋ฏธ์ •๋ ฌ ์›์†Œ๊ฐ€ ํ•˜๋‚˜ ๋‚จ์€ ์ƒํ™ฉ์—์„œ๋Š” ๋งˆ์ง€๋ง‰ ์›์†Œ๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋˜๋ฏ€๋กœ ์‹คํ–‰์„ ์ข…๋ฃŒํ•˜๊ณ  ์„ ํƒ ์ •๋ ฌ์ด ์™„๋ฃŒ ๋œ๋‹ค.

 

์‹œ๊ฐ„๋ณต์žก๋„

O(n²)

 

๊ตฌํ˜„

## ์•Œ๊ณ ๋ฆฌ์ฆ˜
def selectionSort(a[], N) :
        for i from 0 to n-2
                a[i], ... , a[n-1] ์›์†Œ ์ค‘ ์ตœ์†Œ๊ฐ’ a[k] ์ฐพ์Œ
                a[i]์™€ a[k] ๊ตํ™˜

## ์„ ํƒ ์ •๋ ฌ
def selectionSort(a, N) :
        for i in range(N-1) :
                minIdx = i       # ์ตœ์†Œ ์ธ๋ฑ์Šค๋งŒ ์ฐพ๊ธฐ! value๊นŒ์ง€ ์ฐพ์ง€ x 
                for j in range(i+1, N):
                        if a[minIdx] > a[j] :
                                minIdx = j
                a[i], a[minIdx] = a[minIdx], a[i]   # ๊ฐ™๋‹ค๋ฉด ๊ฑด๋„ˆ๋›ฐ๋Š” ์กฐ๊ฑด๋ฌธ ์ถ”๊ฐ€? < ์‹คํ–‰ํ• ๊ฑฐ๋งŒ ๋Š˜์–ด๋‚จ ํ•„์š”์—†์Œ
arr = [7, 2, 5, 3, 4, 3]
N = len(arr)

for i in range(N-1):
    minIdx = i
    for j in range(i+1, N):
        if arr[minIdx] > arr[j]:
            minIdx = j
    arr[minIdx], arr[i] = arr[i], arr[minIdx]  # if๋ฌธ ๋„ฃ์ง€ ๋ง๊ธฐ ์ƒ๊ฐ๋ณด๋‹ค ์€๊ทผ ์žก์•„๋จน์Œ

'๐Ÿถ Programming > Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

5. Search ๊ฒ€์ƒ‰  (0) 2022.10.19
4. Array Extra ๋ฐฐ์—ด  (0) 2022.10.15
2. Array ๋ฐฐ์—ด  (2) 2022.10.01
1. Algorithm ์•Œ๊ณ ๋ฆฌ์ฆ˜  (4) 2022.09.29