์๋ฃ๊ตฌ์กฐ/๐์๊ณ ๋ฆฌ์ฆ - 14
ํ์ต๊ธฐ๋ก
์ค๋ ๋ค์ ๊ฐ์ ๋ชฉ๋ก
- ๋ณํฉ์ ๋ ฌ - 1
- ๋ณํฉ์ ๋ ฌ - 2
- ๋ณํฉ์ ๋ ฌ - 3
- ๋ณํฉ์ ๋ ฌ - 4
๋ณํฉ์ ๋ ฌ
๋ฆฌ์คํธ๋ฅผ ๊ฐ์ฅ ์๊ฒ ์๋ผ์ ์ ๋ ฌํ๊ณ ๋ณํฉํ์ฌ ์ ๋ ฌํ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ ์๊ณ ๋ฆฌ์ฆ ๋๋ถ๋ถ ์ฌ๊ท๋ฅผ ํตํด์ ๊ตฌํํ๋ค.
- ๋ฆฌ์คํธ๋ฅผ ๋ ์ด์ ๋๋ ์ ์์ ๋๊น์ง ๋ฐ์ผ๋ก ๋๋๋ค.
- ๋๋ ์ง ๋๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ฉฐ ๋ ์ด์ ํฉ์น ๋ฆฌ์คํธ๊ฐ ์์ ๋๊น์ง ํฉ์น๋ค.
๋ณํฉ์ ๋ ฌ ์์
[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๋ก ๋ณํฉ์ ๋ ฌ๋ง ์ฃผ๊ตฌ์ฅ์ฐฝ ๊ตฌํํ๋ ์ ์ด ์๋๋ฐ,
๊ทธ๋์์ธ์ง ๋์์ด ๋ง์ด ๋ฌ๋ค.
๋๋ฑ ๊ตฌํ๋์ ๋คํ์ด๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ