ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

์„ ํƒ ์ •๋ ฌ, ๋ฒ„๋ธ” ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋‘ ์‹œ๊ฐ„ ๋ณต์žก๋„ O(N^2)์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ปค์ง€๋ฉด ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋”์šฑ ๋น ๋ฅธ ์ •๋ ฌ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋Œ€ํ‘œ์ ์ธ '๋ถ„ํ•  ์ •๋ ฌ' ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ‰๊ท ์†๋„๊ฐ€ O(N * logN)์ด๋‹ค.

ํ€ต ์ •๋ ฌ์€ ํ•˜๋‚˜์˜ ํฐ ๋ฌธ์ œ๋ฅผ ๋‘๊ฐœ์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•˜๋Š” ์‹์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ •๋ ฌํ•œ๋‹ค. ํŠน์ •ํ•œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ํฐ ์ˆซ์ž์™€ ์ž‘์€ ์ˆซ์ž๋ฅผ ์„œ๋กœ ๊ตํ™˜ํ•œ ๋’ค์— ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.

 

 

 

ํŠน์ •ํ•œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ํฐ ์ˆซ์ž์™€ ์ž‘์€ ์ˆซ์ž๋ฅผ ๋‚˜๋ˆˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํ€ต์ •๋ ฌ์—์„œ๋Š” ๊ธฐ์ค€๊ฐ’์ด ์žˆ๋‹ค. ์ด๋ฅผ ํ”ผ๋ฒ—(Pivot)์ด๋ผ ํ•œ๋‹ค. ๋ณดํ†ต ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๊ฐ’์„ ํ”ผ๋ฒ—๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

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

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•  ๋•Œ๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’์„ ์„ ํƒ => 7

์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•  ๋•Œ๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์„ ํƒ => 2

์„ ํƒ๋œ ๋‘ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ๊ต์ฒดํ•œ๋‹ค.

 

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

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’์„ ์„ ํƒ => 8

์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์„ ํƒ => 1

์„ ํƒ๋œ ๋‘ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ๊ต์ฒดํ•œ๋‹ค.

 

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

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’์„ ์„ ํƒ => 8

์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์„ ํƒ => 1

8๊ณผ 1์€ ์„œ๋กœ ์—‡๊ฐˆ๋ฆฐ ์ƒํ™ฉ(์ž‘์€๊ฐ’์˜ ์ธ๋ฑ์Šค๊ฐ€ ํฐ๊ฐ’์˜ ์ธ๋ฑ์Šค๋ณด๋‹ค ๋” ์ž‘์€ ์ƒํ™ฉ)

์ž‘์€๊ฐ’๊ณผ ํ”ผ๋ฒ—์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.

 

1 2 3 8 5 9 6 10 7 4

3์€ ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง„ ์ƒํƒœ (3์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์€ 3๋ณด๋‹ค ์ž‘์€ ์ˆ˜, ์˜ค๋ฅธ์ชฝ์€ 3๋ณด๋‹ค ํฐ ์ˆ˜)

์ด ์ƒํƒœ์—์„œ 3์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์—์„œ ๋‹ค์‹œ ์ •๋ ฌ ์˜ค๋ฅธ์ชฝ์—์„œ ๋‹ค์‹œ ์ •๋ ฌํ•œ๋‹ค.

 

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

ํ”ผ๋ฒ—๊ฐ’ 1

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’ => 2

์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’ => ์—†์Œ ์ด ๊ฒฝ์šฐ์—๋Š” ์ž๊ธฐ ์ž์‹ ์„ ๊ณ ๋ฆ„ => 1

์—‡๊ฐˆ๋ฆฐ ์ƒํ™ฉ -> ํ”ผ๋ฒ—๊ฐ’๊ณผ ์ž‘์€ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.

 

1 2 3 8 5 9 6 10 7 4

1์€ ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง„ ์ƒํƒœ

ํ”ผ๋ฒ—๊ฐ’ 2

๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌํ•  ๊ฒƒ์ด ์—†์Œ

 

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

ํ”ผ๋ฒ—๊ฐ’ 8

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’ => 9

์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’ => 4

์„ ํƒ๋œ ๋‘ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พผ๋‹ค.

 

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

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’ => 10

์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’ => 7

์„ ํƒ๋œ ๋‘ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พผ๋‹ค.

 

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

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’ => 10

์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’ => 7

์—‡๊ฐˆ๋ฆฐ ์ƒํ™ฉ -> ํ”ผ๋ฒ—๊ฐ’๊ณผ ์ž‘์€ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.

 

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

ํ”ผ๋ฒ—๊ฐ’ 7

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’ => ์—†์Œ -> ํ”ผ๋ฒ—๊ฐ’์œผ๋กœ ์„ค์ • 7

์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’ => 6

์—‡๊ฐˆ๋ฆฐ ์ƒํ™ฉ -> ํ”ผ๋ฒ—๊ฐ’๊ณผ ์ž‘์€ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พผ๋‹ค.

 

1 2 3 6 5 4 7 8 10 9

์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ˜๋ณต์„ ํ•œ๋‹ค.

๊ทธ๋Ÿผ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ ฌ์ด ๋œ๋‹ค.

1 2 3 4 5 6 7 8 9 10

 

 

ํ€ต ์ •๋ ฌ์ด ๊ฐ•๋ ฅํ•œ ์ด์œ ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์„ค๋ช…์„ ํ•ด๋ณด์ž๋ฉด ๊ธฐ์กด ์„ ํƒ, ๋ฒ„๋ธ”, ์‚ฝ์ž… ์ •๋ ฌ ๊ฐ™์€ ๊ฒฝ์šฐ 10๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ 100๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋‹ค.

1 2 3 4 5 6 7 8 9 10

N ^ 2 = 10 * 10 = 100

 

ํ€ต ์ •๋ ฌ์€ ๋ถ„ํ• ๋กœ ์ •๋ ฌ ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ๋” ์ž‘์€ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ์›๋ฆฌ๋กœ ํ€ต ์ •๋ ฌ์ด ๋น ๋ฅด๊ฒŒ ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

1 2 3 4 5 / 6 7 8 9 10

5 * 5 + 5 * 5 = 50

 

 

 

ํŒŒ์ด์ฌ ์ฝ”๋“œ
# ํ€ต ์ •๋ ฌ (Quick Sort)
# ํŠน์ •ํ•œ ํ”ผ๋ฒ—๊ฐ’์„ ์ด์šฉํ•ด์„œ ํ”ผ๋ฒ—๊ฐ’๋ณด๋‹ค ํฐ๊ฐ’๊ณผ ์ž‘์€๊ฐ’์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ์—ฐ์‚ฐ
# ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ”ผ๋ฒ—๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์€ ์™ผ์ชฝ, ํฐ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ถ„ํ• ์ด ๋œ๋‹ค
# ์‹ค์ œ๋กœ ์†Œ์Šค์ฝ”๋“œ์ƒ์—์„œ๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

def quick_sort(data, start, end):

    # start๋Š” ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์ฒซ๋ฒˆ์งธ ๊ฐ’ end๋Š” ๋งˆ์ง€๋ง‰ ๊ฐ’
    if start >= end: # ์›์†Œ๊ฐ€ ํ•œ๊ฐœ์ธ ๊ฒฝ์šฐ
        return
    
    # key๋Š” ํ”ผ๋ด‡๊ฐ’์œผ๋กœ ์ฒซ๋ฒˆ์งธ ์›์†Œ๊ฐ’์œผ๋กœ ์žก์•„์ค€๋‹ค
    key = start     
    
    # ํƒ์ƒ‰ํ•˜๊ธฐ์œ„ํ•œ ๋ณ€์ˆ˜๋“ค
    i = start + 1   # ์™ผ์ชฝ ์ถœ๋ฐœ ์ง€์ 
    j = end         # ์˜ค๋ฅธ์ชฝ ์ถœ๋ฐœ ์ง€์ 
    
    
    while i <= j: # ์—‡๊ฐˆ๋ฆด ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต    
        # ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
        while i <= end and data[i] <= data[key]: # ํ‚ค๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
            i = i + 1
        # ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์ด๋™
        while data[j] >= data[key] and j > start: # ํ‚ค๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์™ผ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
            j = j - 1
            
        # ๊ต์ฒดํ•˜๋Š” ๋กœ์ง
        if i > j: # ์—‡๊ฐˆ๋ฆฐ ์ƒํƒœ๋ฉด ํ‚ค๊ฐ’๊ณผ ์ž‘์€ ๊ฐ’์„ ๊ต์ฒด
            temp = data[j]
            data[j] = data[key]
            data[key] = temp
        else: # ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ํฐ ๊ฐ’๊ณผ ์ž‘์€ ๊ฐ’์„ ๊ต์ฒด
            temp = data[i]
            data[i] = data[j]
            data[j] = temp
    
    # ์ •๋ ฌ์ด ๋๋‚˜๋ฉด ๊ฐ๊ฐ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ์„ ์‹คํ–‰ํ•ด์ค€๋‹ค.
    quick_sort(data, start, j - 1)
    quick_sort(data, j + 1, end)

    return data


test = [3, 7, 8, 1, 5, 9, 6, 10, 2, 4]
print("์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ : {}".format(quick_sort(test, 0, len(test)-1)))

 

 

 

 

ํ€ต ์ •๋ ฌ์˜ ๋‹จ์ 

ํ€ต ์ •๋ ฌ์˜ ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N * logN)์ด๋‹ค. ํ•˜์ง€๋งŒ ํ”ผ๋ฒ—๊ฐ’์„ ๋ฌด์—‡์œผ๋กœ ์„ค์ •ํ•˜๋Š”์ง€์— ๋”ฐ๋ผ์„œ ์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N^2) ๊ฐ€ ๋‚˜์˜จ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

์ด๋ฏธ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

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

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐˆ ๋•Œ ํ”ผ๋ฒ—๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’ -> 2

์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๊ฐˆ ๋•Œ ํ”ผ๋ฒ—๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’ -> ์—†์Œ -> 1

์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๊ฐˆ ๋•Œ ํ”ผ๋ฒ—๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์ฐพ์ง€ ๋ชปํ•ด์„œ 1๊นŒ์ง€ ์˜ค๊ฒŒ ๋œ๋‹ค. ์—ฐ์‚ฐ์ด 10๋ฒˆ ๋ฐœ์ƒํ•˜๋Š”๋ฐ ์ •๋ ฌ์€ ๊ณ ์ž‘ 1ํ•˜๋‚˜๋งŒ ์™„๋ฃŒํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹ค์Œ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ์—๋„ 9๋ฒˆ, 8๋ฒˆ ... ๋ฐœ์ƒํ•˜๊ณ  ๋ถ„ํ•  ์ •๋ ฌ์˜ ์ด์ ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ด์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N * N)์ด ๋œ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋Š” ์‚ฝ์ž… ์ •๋ ฌ์ด ๋” ๋น ๋ฅด๋‹ค.

 

 

์ •๋ ฌํ•  ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

 

ํ€ต ์ •๋ ฌ ์†Œ์Šค์ฝ”๋“œ์—์„œ ๋‹จ ๋‘ ๋ถ€๋ถ„๋งŒ ๋ฐ”๊พธ์–ด์„œ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ฐ”๊พธ์–ด ๋ณด์ž.

        while i <= end and data[i] >= data[key]: 
            i = i + 1

        while data[j] <= data[key] and j > start: 
            j = j - 1

 

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€