์ž๋ฃŒ๊ตฌ์กฐ/๐Ÿ‘‰์•Œ๊ณ ๋ฆฌ์ฆ˜ - 14

ํ•™์Šต๊ธฐ๋ก

์˜ค๋Š˜ ๋“ค์€ ๊ฐ•์˜ ๋ชฉ๋ก

  1. ๋ณ‘ํ•ฉ์ •๋ ฌ - 1
  2. ๋ณ‘ํ•ฉ์ •๋ ฌ - 2
  3. ๋ณ‘ํ•ฉ์ •๋ ฌ - 3
  4. ๋ณ‘ํ•ฉ์ •๋ ฌ - 4

๋ณ‘ํ•ฉ์ •๋ ฌ

๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์žฅ ์ž‘๊ฒŒ ์ž˜๋ผ์„œ ์ •๋ ฌํ•˜๊ณ  ๋ณ‘ํ•ฉํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋Œ€๋ถ€๋ถ„ ์žฌ๊ท€๋ฅผ ํ†ตํ•ด์„œ ๊ตฌํ˜„ํ•œ๋‹ค.

  1. ๋ฆฌ์ŠคํŠธ๋ฅผ ๋” ์ด์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  2. ๋‚˜๋ˆ ์ง„ ๋‘๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•˜๋ฉฐ ๋” ์ด์ƒ ํ•ฉ์น  ๋ฆฌ์ŠคํŠธ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ํ•ฉ์นœ๋‹ค.

์›€์งค

๋ณ‘ํ•ฉ์ •๋ ฌ ์˜ˆ์‹œ

[5, 6, 3, 4, 7, 2]
[5, 6, 3] / [4, 7, 2]
[5, 6] / [3] / [4, 7] / [2]
[5] / [6] / [3] / [4] / [7] / [2]
์ •๋ ฌํ•˜๋ฉฐ ํ•ฉ์นจ
[5, 6] / [3] / [4, 7] / [2]
[3, 5, 6] / [2, 4 ,7]
[2, 3, 4, 5, 6, 7]

[3, 5, 6] / [2, 4 ,7]
[2, 3, 4, 5, 6, 7]
์—ฌ๊ธฐ์—์„œ ํ•ฉ์ณ์ง€๋Š” ๊ณผ์ •์„ ๋ณด์ž๋ฉด

์™ผ์ชฝ์˜ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์š”์†Œ์™€ ์˜ค๋ฅธ์ชฝ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์€ ๊ฐ’์„ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๊ณ ,
[โ€œ3โ€, 5, 6] / [โ€œ2โ€, 4, 7] [โ€œ2โ€] ์˜ค๋ฅธ์ชฝ์˜ ๊ฐ’์„ ๋„ฃ์—ˆ์œผ๋ฏ€๋กœ, ์™ผ์ชฝ์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ์™€ ์˜ค๋ฅธ์ชฝ์˜ ๋‹ค์Œ์š”์†Œ์ธ ๋‘๋ฒˆ์งธ ์š”์†Œ์™€ ๋น„๊ตํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๋Š”๋‹ค. [โ€œ3โ€, 5, 6] / [2, โ€œ4โ€, 7]
[2, โ€œ3โ€]
์ด๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด,
[3, โ€œ5โ€, 6] / [2, โ€œ4โ€, 7]
[2, 3, โ€œ4โ€]
[3, โ€œ5โ€, 6] / [2, 4, โ€œ7โ€]
[2, 3, 4, โ€œ5โ€]
[3, 5, โ€œ6โ€] / [2, 4, โ€œ7โ€]
[2, 3, 4, 5, โ€œ6โ€]
์ด๋ ‡๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ ์™ผ์ชฝ์˜ ์š”์†Œ๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด๊ฐ”์œผ๋ฏ€๋กœ,
์˜ค๋ฅธ์ชฝ์˜ ๋ฆฌ์ŠคํŠธ์— ๋‚จ์€ ๊ฐ’๋“ค์€ ์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ณด๋‹ค ๊ฐ’์ด ํฌ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ, ์˜ค๋ฅธ์ชฝ ์š”์†Œ์— ๋‚จ์€ ๊ฐ’๋“ค์„ ๋ชจ๋‘ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๋Š”๋‹ค.
[2, 3, 4, 5, 6, โ€œ7โ€]

๋ฐฉ๊ธˆ์€ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ์— ๊ฐ’์ด ํ•˜๋‚˜๋งŒ ๋‚จ์•„์žˆ์–ด์„œ ์ข‹์€ ์˜ˆ์‹œ๋Š” ์•„๋‹ˆ๋ผ์„œ ๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ๋“ค์ž๋ฉด,
[2, 4, โ€œ6โ€] / [5, โ€œ7โ€, 9]
[2, 4, 5, โ€œ6โ€]
์œ„์—์„œ ์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ’๋“ค์ด ๋ชจ๋‘ ๋“ค์–ด๊ฐ”์œผ๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ์˜ 7๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๋Š”๋‹ค.
[2, 4, 5, 6, 7, 9]

๋ณ‘ํ•ฉ์ •๋ ฌ ๊ตฌํ˜„

def mergeSort(list):
    if len(list) <= 1:
        return list
    mid = int(len(list)/2)
    #print("left : ", list[:mid], " right : ", list[mid:])
    # ์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ์™€ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‚˜๋ˆ„์–ด ๋ณ‘ํ•ฉ๋œ ๊ฒฐ๊ณผ๋ฅผ ll, rl์— ์ €์žฅ
    ll, rl = mergeSort(list[:mid]), mergeSort(list[mid:])
    idx, li, ri = 0, 0, 0
    # ll, rl์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ถ€๋ถ„
    while True:
        if ll[li] < rl[ri]:
            list[idx] = ll[li]
            li += 1
            idx += 1
            if li == len(ll):
            # ์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค ๋„ฃ์Œ, ์˜ค๋ฅธ์ชฝ์— ๋‚จ์•„์žˆ๋Š” ๊ฐ’๋“ค ์ฒ˜๋ฆฌ
                for i in range(ri, len(rl)):
                    list[idx] = rl[i]
                    idx += 1
                break
        else:
            list[idx] = rl[ri]
            ri += 1
            idx += 1
            if ri == len(rl):
            # ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค ๋„ฃ์Œ, ์™ผ์ชฝ์— ๋‚จ์•„์žˆ๋Š” ๊ฐ’๋“ค ์ฒ˜๋ฆฌ
                for i in range(li, len(ll)):
                    list[idx] = ll[i]
                    idx += 1
                break
    #print(list)
    return list
    
# ์ตœ๋Œ€ 1000์˜ ๋žœ๋ค๊ฐ’ ์ค‘  100๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€์ง„๋ฆฌ์ŠคํŠธ๋ฅผ 1000๋ฒˆ ์ •๋ ฌํ•˜๊ณ ,
# ๋ฆฌ์ŠคํŠธ๋Š” ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
print(checkSortFunc(mergeSort, 1000, 100, 1000))

๋ณ‘ํ•ฉ์ •๋ ฌ์€ ์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ๋‹ค.
ll๊ณผ rl์— mergeSort๋ฅผ ํ†ตํ•ด list๋ฅผ ๋‘˜๋กœ ๋‚˜๋ˆ ์„œ ๊ฐ๊ฐ ๋ณ‘ํ•ฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ณ ,
ll๊ณผ rl์„ ๋ณ‘ํ•ฉํ•˜์—ฌ list์— ์ €์žฅํ•˜๊ณ , ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ–ˆ๋‹ค. (์›๋ณธ๋„ ๋ณ€๊ฒฝ)

๊ฒฐ๊ณผ

๋ณ‘ํ•ฉ์ •๋ ฌ ์‹œ๊ฐ„๋ณต์žก๋„

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

๋…ธ๋“œ๊ฐ€ ํ•œ๊ฐœ๊ฐ€ ๋ ๋•Œ๊นŒ์ง€ ๋‘˜๋กœ ๋‚˜๋‰˜๋ฏ€๋กœ ๊นŠ์ด๋Š” $log_2 n$์ด ๋œ๋‹ค.
๋”ฐ๋ผ์„œ ํ•ฉ์ณ์ง€๋Š” ํšŸ์ˆ˜๋Š” ์ด $log_2 n$๋ฒˆ์ด๋‹ค.
๊ฐ™์€ ๋†’์ด์—์„œ ํ•ฉ์ณ์งˆ๋•Œ ๋งˆ๋‹ค ์ •๋ ฌํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ตœ๋Œ€ $n$๋ฒˆ์„ ํ•˜๊ฒŒ๋œ๋‹ค.
๋”ฐ๋ผ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” $(์ •๋ ฌํ• ๋•Œ์˜ ๋น„๊ตํšŸ์ˆ˜) * (ํ•ฉ์น˜๋Š” ํšŸ์ˆ˜)$๊ฐ€ ๋œ๋‹ค.
์‹œ๊ฐ„๋ณต์žก๋„ : $O(n log n)$์ด ๋œ๋‹ค.

๋‚ด์šฉ
์œ„ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•ด๋„ ๋œ๋‹ค.

checkSortFunc ๊ฐœ์„ 

# checkSortFunc(์ •๋ ฌํ•จ์ˆ˜, ์ตœ๋Œ€๋žœ๋ค๊ฐ’, ๋žœ๋ค๊ฐ’์˜ ๊ฐฏ์ˆ˜, ๋ฐ˜๋ณต(๊ฒ€์‚ฌ)ํšŸ์ˆ˜, ๋ฆฌ์ŠคํŠธ์ถœ๋ ฅ์—ฌ๋ถ€)
def checkSortFunc(func, maxrand=1000 , elemcnt = 10, repeatcnt = 10, printlist = False):
    isSorted = False
    for i in range(0, repeatcnt):
        list = random.sample(range(maxrand), elemcnt)
        if printlist:
            print("raw : ", list)
        list = func(list)
        for i in range(0, len(list)-1):
            if list[i] > list[i + 1]:
                print(list)
                return False
        if printlist:
            print("sorted : ", list)
    return True

๋งˆ์ง€๋ง‰

์˜ˆ์ „์— C๋กœ ๋ณ‘ํ•ฉ์ •๋ ฌ๋งŒ ์ฃผ๊ตฌ์žฅ์ฐฝ ๊ตฌํ˜„ํ–ˆ๋˜ ์ ์ด ์žˆ๋Š”๋ฐ,
๊ทธ๋ž˜์„œ์ธ์ง€ ๋„์›€์ด ๋งŽ์ด ๋ฌ๋‹ค.
๋š๋”ฑ ๊ตฌํ˜„๋˜์„œ ๋‹คํ–‰์ด๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ