Algorithm/Python

[Python] ๋ณ‘ํ•ฉ์ •๋ ฌ

๐ŸฅญMango 2020. 8. 23. 23:55

๋ณ‘ํ•ฉ์ •๋ ฌ

๋ฐ์ดํ„ฐ์˜ ์š”์†Œ๋“ค์„ ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆˆ ํ›„ ์ •๋ ฌํ•˜๊ณ , ์ •๋ ฌ๋œ ๋‘ ๊ทธ๋ฃน์„ ๋น„๊ตํ•˜๋ฉฐ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

๋ณ‘ํ•ฉ์ •๋ ฌ๊ณผ์ •

#์ˆซ์ž 8๊ฐœ๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค 
group1 = [2, 8, 4, 7]
group2 = [6, 1, 3, 5]

#๋‘ ๊ทธ๋ฃน์„ ์ •๋ ฌํ•œ๋‹ค.
group1 = [2, 4, 7, 8]
group2 = [1, 3, 5, 6]

#๋‘ ๊ทธ๋ฃน์„ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ํ•ฉ์นœ๋‹ค.
๋‘ ๊ทธ๋ฃน์˜ ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๋น„๊ตํ•ด ์ž‘์€ ๊ฐ’์„ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ(result)์— ๋„ฃ๋Š”๋‹ค.
group1 = [2, 4, 7, 8]
group2 = [3, 5, 6]
result = [1]

#๋‘ ๊ทธ๋ฃน์˜ ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๋น„๊ตํ•ด ์ž‘์€ ๊ฐ’์„ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
group1 = [4, 7, 8]
group2 = [3, 5, 6]
result = [1, 2]

group1 = [4, 7, 8]
group2 = [5, 6]
result = [1, 2, 3]

group1 = [7, 8]
group2 = [5, 6]
result = [1, 2, 3, 4]

group1 = [7, 8]
group2 = [6]
result = [1, 2, 3, 4, 5]

group1 = [7, 8]
group2 = []
result = [1, 2, 3, 4, 5, 6]

#group2์—๋Š” ์ž๋ฃŒ๊ฐ€ ์—†์œผ๋ฏ€๋กœ group1์— ๋‚จ์•„์žˆ๋Š” ์ž๋ฃŒ๋ฅผ ๋ชจ๋‘ result๋กœ ์˜ฎ๊ธด๋‹ค.
group1 = []
group2 = []
result = [1, 2, 3, 4, 5, 6, 7, 8]

๊ฒฐ๊ณผ : [1, 2, 3, 4, 5, 6, 7, 8]



๋ณ‘ํ•ฉ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

def merge_sort(a):
    n = len(a)

    if n <= 1:
        return

    mid = n // 2
    g1 = a[:mid]
    g2 = a[mid:]
    merge_sort(g1)
    merge_sort(g2)

    i = 0
    j = 0
    k = 0

    while i < len(g1) and j < len(g2):
        if g1[i] < g2[j]:
            a[k] = g1[i]
            i += 1
            k += 1
        else:
            a[k] = g2[j]
            j += 1
            k += 1
    
    while i < len(g1):
        a[k] = g1[i]
        i += 1
        k += 1
    while j < len(g2):
        a[k] = g2[j]
        j += 1
        k += 1

d = [6, 8, 3, 9, 10, 1, 2, 4, 7, 5]
merge_sort(d)
print(d)

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•

def merge_sort(a):
    n = len(a)

    if n <= 1:
        return a
    
    mid = n // 2
    g1 = merge_sort(a[:mid])
    g2 = merge_sort(a[mid:])
    result = []
    while g1 and g2:
        if g1[0] < g2[0]:
            result.append(g1.pop(0))
        else:
            result.append(g2.pop(0))
    while g1:
        result.append(g1.pop(0))
    while g2:
        result.append(g2.pop(0))
    return result

d = [6, 8, 3, 9, 10, 1, 2, 4, 7, 5]
print(merge_sort(d))

์ฐธ๊ณ 

๋ณ‘ํ•ฉ์ •๋ ฌ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N * logN)์ด๋‹ค.