CS/Algorithm

ํ€ต ์ •๋ ฌ(quick sort)

deo2kim 2020. 9. 24. 12:27
๋ฐ˜์‘ํ˜•

๐Ÿ“” ํ€ต ์ •๋ ฌ(quick sort) ์ด๋ž€

  • ๋ถ„ํ• ์ •๋ณต์„ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(nlogn) ํ€ต์ด๋ž€ ์ด๋ฆ„์— ๋งž๊ฒŒ ๋น ๋ฅด๋‹ค.
  • ๋ถ„ํ• ์ •๋ณต: ๋ฌธ์ œ๋ฅผ ์ž‘์€ 2๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ฐ๊ฐ ํ•ด๊ฒฐํ•œ ํ›„, ๋‹ค์‹œ ๋ชจ์•„ ์›๋ž˜์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•.
    ๋ณดํ†ต ์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ•œ๋‹ค.

  • ๊ธฐ์ค€ ๊ฐ’(pivot)์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’๊ณผ ์ž‘์€ ๊ฐ’์„ ์„œ๋กœ ๊ตํ™˜ํ•œ ๋’ค ๊ธฐ์ค€ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋‘๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜๋ˆˆ๋‹ค. (๊ธฐ์ค€ ๊ฐ’์˜ ์™ผ์ชฝ์—๋Š” ์ž‘์€ ๊ฐ’, ์˜ค๋ฅธ์ชฝ์—๋Š” ํฐ ๊ฐ’)
  • ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ํ€ต์ •๋ ฌ์ด ๊ฐ€์žฅ ๋น ๋ฅด๋‹ค. (c์–ธ์–ด์˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ํ€ต์ •๋ ฌ ๊ธฐ๋ฐ˜)
  • ๋น„๊ต ์ •๋ ฌ ( ๋‹ค๋ฅธ ์›์†Œ์™€์˜ ๋น„๊ต )

 

๐Ÿ“” ํ€ต ์ •๋ ฌ(quick sort) ์˜ˆ์ œ

  • ๋งจ์•ž์˜ ๊ฐ’ 3์„ pivot ๊ฐ’์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค ( ๋ณดํ†ต ๊ฐ€์žฅ ์•ž์˜ ๊ฐ’์„ pivot์œผ๋กœ ์„ค์ •)
  • pivot๊ฐ’์˜ ๋ฐ”๋กœ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ๋์œผ๋กœ pivot๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์„ ํƒ์ƒ‰ ( 8์„ ์ฐพ์Œ )
  • ์˜ค๋ฅธ์ชฝ ๋งฝ ๋์—์„œ๋ถ€ํ„ฐ ์™ผ์ชฝ์œผ๋กœ pivot๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ํƒ์ƒ‰ ( 2 ์ฐพ์Œ )
  • ๋‘˜์„ ์„œ๋กœ ๊ตํ™˜ํ•ด์ค€๋‹ค.

  • ํฐ ๊ฐ’ (7), ์ž‘์€ ๊ฐ’ (2)
  • ํ•˜์ง€๋งŒ ์„œ๋กœ ์—‡๊ฐˆ๋ ธ๋‹ค. ( ์ž‘์€ ๊ฐ’์˜ ์ธ๋ฑ์Šค๊ฐ€ ํฐ ๊ฐ’์˜ ์ธ๋ฑ์Šค๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ)
  • ์ด ๊ฒฝ์šฐ pivot๊ฐ’๊ณผ ์ž‘์€ ๊ฐ’์„ ๋ฐ”๊ฟ”์ค€๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  pivot๊ฐ’์€ ์ด์ œ ๊ณ ์ •์ด๋ฉฐ, pivot๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋‘๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์žฌ๊ท€๋Š” ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ 1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต.
  • ์žฌ๊ท€ ํ˜ธ์ถœ ํ•œ๋ฒˆ์— ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ์›์†Œ๋Š” ์œ„์น˜๊ฐ€ ์ •ํ•ด์ง€๋ฏ€๋กœ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฐ˜๋“œ์‹œ ๋๋‚˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์™ผ์ชฝ์˜ ๋ฆฌ์ŠคํŠธ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด๋ฉด pivot (2), ์ž‘์€๊ฐ’(1) ํฐ ๊ฐ’์€ ์—†๋‹ค. ( ํฐ ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ ํฐ ๊ฐ’์˜ ์ธ๋ฑ์Šค๋Š” ์ž‘์€ ๊ฐ’์„ ๋„˜์–ด๊ฐ”์„ ๊ฒƒ์ด๋‹ค. - ์—‡๊ฐˆ๋ฆผ)
  • pivot๊ฐ’๊ณผ ์ž‘์€๊ฐ’์„ ๋ฐ”๊ฟ”์ค€๋‹ค. pivot(2)๋Š” ๊ณ ์ •

  • pivot(1), ์ž‘์€๊ฐ’(0), ํฐ๊ฐ’ ์—†์Œ
  • pivot๊ณผ ์ž‘์€๊ฐ’์„ ๋ฐ”๊ฟ”์ค€๋‹ค. ๋‘˜ ๋‹ค ๊ณ ์ •

  • ์ด์ œ ์˜ค๋ฅธ์ชฝ์„ ๋ณด๋ฉด pivot(7), ํฐ ๊ฐ’(8), ์ž‘์€ ๊ฐ’(6) ์ด๋‹ค. ํฐ ๊ฐ’๊ณผ ์ž‘์€ ๊ฐ’ ๊ตํ™˜

  • ๋‹ค์‹œ pivot(7), ์ž‘์€ ๊ฐ’(4), ํฐ ๊ฐ’(9) ํ•˜์ง€๋งŒ ์—‡๊ฐˆ๋ฆผ
  • pivot๊ณผ 4๋ฅผ ๊ตํ™˜. pivot fix!

 

 

 

๐Ÿ“” ํ€ต ์ •๋ ฌ(quick sort) ๊ตฌํ˜„

def quick_sort(numbers, start, end):
    if start >= end:  # ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ
        return

    pivot = start  # pivot ๊ฐ€์žฅ ์™ผ์ชฝ์˜ ์›์†Œ
    i = start + 1
    j = end
    while i <= j:  # ์—‡๊ฐˆ๋ฆด ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต
        while i <= j:
            if numbers[i] >= numbers[pivot]:  # pivot ๋ณด๋‹ค ํฐ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ
                break
            else:
                i += 1
        while j >= i:
            if numbers[j] <= numbers[pivot]:  # pivot ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ
                break
            else:
                j -= 1

        if j < i:  # ์—‡๊ฐˆ๋ฆฌ๋ฉด pivot ๊ณผ ์ž‘์€๊ฐ’์„ ๊ต์ฒด
            numbers[pivot], numbers[j] = numbers[j], numbers[pivot]
        else:  # ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ํฐ๊ฐ’(i)์™€ ์ž‘์€๊ฐ’(j)๋ฅผ ๊ต์ฒด
            numbers[i], numbers[j] = numbers[j], numbers[i]
        print(f'์ •๋ ฌ ์ค‘: {numbers}')

    # ๊ต์ฒดํ•œ ์ž‘์€๊ฐ’(j)๋Š” fix!! fix ๋œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์–‘์ชฝ์œผ๋กœ ๋‚˜๋ˆ ์„œ ๋ถ„ํ• ์ •๋ณต
    quick_sort(numbers, start, j - 1)
    quick_sort(numbers, j + 1, end)


numbers = [3, 0, 1, 8, 7, 2, 5, 4, 9, 6]
print(f'์ •๋ ฌ ์ „: {numbers}')
print()

quick_sort(numbers, 0, len(numbers) - 1)

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

๋” ๊ฐ„ํŽธํ•œ ๋ฐฉ๋ฒ•

def quick_sort(numbers):
    # ํ”ผ๋ด‡์„ ์ •ํ•œ๋‹ค. ๋งจ ๋’ค ๊ฐ’์„ ์ •ํ–ˆ๋‹ค.
    length = len(numbers)
    if length <= 1:
        return numbers
    else:
        pivot = numbers.pop()
        low_numbers = []
        high_numbers = []
        for i in range(length - 1):
            if numbers[i] > pivot:
                high_numbers.append(numbers[i])
            else:
                low_numbers.append(numbers[i])

        return quick_sort(low_numbers) + [pivot] + quick_sort(high_numbers)


nn = [9, 5, 1, 6, 8, 4, 2, 3, 7, 0]
print(f'์ •๋ ฌ ์ „: {nn}')
print(f'์ •๋ ฌ ํ›„: {quick_sort(nn)}')

๐Ÿ“” ํ€ต ์ •๋ ฌ(quick sort) ํŠน์ง•

  • ์žฅ์ 
    • ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค. O(nlogn) ๋ถ„ํ• ์ •๋ณต์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค ๋‹จ๊ณ„์—์„œ ์ ์–ด๋„ 1๊ฐœ์˜ ์›์†Œ๊ฐ€ ์ž๋ฆฌ๋ฅผ ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌํ•  ๊ฐœ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ.
  • ๋‹จ์ 
    • ๋ถˆ์•ˆ์ • ์ •๋ ฌ - ๋™์ผํ•œ ๊ฐ’์— ๋Œ€ํ•ด์„œ ๊ธฐ์กด์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค.
      ๋งŒ์•ฝ(A1, A3, A2, B, C)์ผ ๊ฒฝ์šฐ ์ˆœ์„œ๊ฐ€ A์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.
    • ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋‚˜์˜จ๋‹ค.
      • ๋Œ€๋ถ€๋ถ„ ์ •๋ ฌ๋œ ์ƒํƒœ๋ผ๋ฉด ๋ถ„ํ• ์ •๋ณต์˜ ์ด์ ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ - ์ด๋Ÿด ๋•Œ๋Š” ์‚ฝ์ž…์ •๋ ฌ์„ ์‚ฌ์šฉํ•ด๋ณด์ž!!!
      • ๋˜ pivot๊ฐ’์„ ์ž˜๋ชป ์„ค์ •ํ•  ๊ฒฝ์šฐ(์šด์ด ๋‚˜์˜๋ฉด) - ํฌ๊ธฐ๊ฐ€ ์ ๋‹นํ•œ pivot๊ฐ’์„ ์ฐพ์•„์„œ ์‚ฌ์šฉ.

 

๐Ÿ“” ํ€ต ์ •๋ ฌ(quick sort) ์ฐธ๊ต์ž๋ฃŒ

 

๋ฐ˜์‘ํ˜•