์๋ ํ์ธ์ Foma ๐ป ์ ๋๋ค!
์ค๋์ ๋๋์ด ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์์ ๋ง ๊ทธ๋๋ก ๋งค์ฐ ๋น ๋ฅธ ์ํ์๊ฐ์ ๊ฐ์ง ํต ์ ๋ ฌ์ ๋ํด์ ์์๋ณด๋ ค๊ณ ํฉ๋๋ค!
๋ฐ๋ก ์์ํ ๊ฒ์~
ํต ์ ๋ ฌ(Quick Sort)์ด๋? ๐ง
ํต ์ ๋ ฌ(Quicksort)์ ์ฐฐ์ค ์คํฐ๋ ๋ฆฌ์ฒ๋ ํธ์ด๊ฐ ๊ฐ๋ฐํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ค๋ฅธ ์์์์ ๋น๊ต๋ง์ผ๋ก ์ ๋ ฌ์ ์ํํ๋ ๋น๊ต ์ ๋ ฌ์ ์ํ๋ค. - ์ํค ๋ฐฑ๊ณผ -
(์ฐธ๊ณ ๋ก ๋ฆฌ์ฒ๋ ํธ์ด๊ฐ ํต ์ ๋ ฌ์ ๊ฐ๋ฐํ์ ๋น์ ๋์ด๋ 26์ด์ด๋ผ๊ณ ํ๋ค์...)
ํฉ๋ณ ์ ๋ ฌ๊ณผ ๊ฐ์ด ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ํ๊ณ ํ๊ท ์ ์ผ๋ก ๋งค์ฐ ๋น ๋ฅธ ์ํ์๋๋ฅผ ์๋ํฉ๋๋ค.
ํต ์ ๋ ฌ ๊ณผ์ ๐จ
ํต ์ ๋ ฌ์ ํ๊ธฐ ์ํด์ ํผ๋ด(Pivot)์ด ํต์ฌ์ด ๋๋๋ฐ์.
์ฌ๊ธฐ์ ํผ๋ด์ ์ด๋ค ๊ฒ์ผ๊น์?
ํผ๋ด์ ๋ฐ๋ก ๊ธฐ์ค์ ๋๋ค.
ํผ๋ด์ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ์ ํํ ์๋ ์๊ณ ๊ฐ์ฅ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ์ ํํ ์๋ ์๊ณ ์ค๊ฐ์ ์๋ ์ธ๋ฑ์ค๋ฅผ ์ ํํ ์๋ ์์ต๋๋ค.
ํผ๋ด์ ์ด๋ค ๊ฒ์ ์ ํํ๋์ ๋ฐ๋ผ์ ์ํ ์๊ฐ์ด ๋ฌ๋ผ์ง๋๋ฐ์.
์ด๋ฒ ์๊ฐ์๋ ์ค๊ฐ ์ง์ ์ ํผ๋ด์ผ๋ก ์ก๋ ํต ์ ๋ ฌ ๋ฐฉ์์ผ๋ก ์งํํ๊ฒ ์ต๋๋ค.
์๋์ ๊ฐ์ ๋ฐฐ์ด์ด ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
10๊ฐ์ ์์๊ฐ ์์ผ๋ฏ๋ก ์ค๊ฐ๊ฐ์ 5๋ฒ์งธ์ธ 2๊ฐ ๋๊ฒ ์ฃ ?
๊ฐ์ฅ ์ผ์ชฝ๊ณผ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ํฌ์ธํฐ๋ฅผ ๋ฌ์์ค๋๋ค.
์ผ์ชฝ ํฌ์ธํฐ๋ ํผ๋ด์ ๊ฐ๋ณด๋ค ๋ ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ด ๋์ฌ ๋๊น์ง ์ค๋ฅธ์ชฝ์ผ๋ก ์งํํ๊ณ
์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ ํผ๋ด์ ๊ฐ๋ณด๋ค ๋ ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ด ๋์ฌ ๋๊น์ง ์ผ์ชฝ์ผ๋ก ์งํํ ๊ฑฐ์์.
์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ธฐ๋ ค๋๋ฐ ์ด๋ฏธ ํผ๋ด๊ฐ๋ณด๋ค ๋ ํฐ ๊ฐ์ด ์์ฃ ?
์ด ๋๋ ํผ๋ด๊ณผ ํฌ์ธํฐ์ ๊ฐ์ ์๋ก ๋ฐ๊ฟ์ค๋๋ค.
๊ทธ ๋ค์์ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ฅผ ์ผ์ชฝ์ผ๋ก ์์ง์ฌ์ฃผ๋ ค๋๋ฐ ์ด๋ฏธ ํผ๋ด๊ฐ๋ณด๋ค ์์์ ธ์์ฃ ?
ํผ๋ด๊ฐ๊ณผ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ ๊ฐ์ ๋ฐ๊ฟ์ค๋๋ค.
์ด์ ๋ ๋ค์ ์ผ์ชฝ์ ์๋ ํฌ์ธํฐ๋ฅผ ํผ๋ด๊ฐ๋ณด๋ค ๋ ํฌ๊ฑฐ๋ ๊ฐ์ ๋๊น์ง ์ค๋ฅธ์ชฝ์ผ๋ก ์์ง์ฌ ์ค๋๋ค.
ํผ๋ด ๊ฐ์ด 6์ด๋ฏ๋ก 8์์ ๋ฉ์ถ๊ฒ ์ฃ ? 8๊ณผ 6์ ์ค์ํด์ค๋๋ค.
์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ฅผ ํผ๋ด ๊ฐ๋ณด๋ค ๋ ์์ ๋๊น์ง ์ผ์ชฝ์ผ๋ก ์์ง์ฌ์ค๋๋ค.
๋ฐ๋ก ์์ธ 5์์ ๋ฉ์ถ๊ฒ ์ฃ ? 5์ 8์ ์ค์ํด์ค๋๋ค.
์ด๋ฐ ์์ผ๋ก ์งํํด์ฃผ๋ฉด ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ด ๊ฒน์น๋ ์๊ฐ์ด ์ต๋๋ค.
์ด ๋ ๊ฒน์น๋ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋ ์ค๋๋ค.
๋๋ ์ง ์์๋ค์ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์งํํด์ค๋๋ค.
์ค๋ฅธ์ชฝ์ ๋นจ๊ฐ๋ฐ์ค๋ถํฐ ์งํํด์ฃผ๋ฉด ์๋์ ๊ฐ์ด 7,6,9๋ก ๋๋ ์ง๊ณ 9,10์ผ๋ก ๋๋ ์ง๋๋ค.
๋ 9,10์ ํต ์ ๋ ฌ ๋ฐฉ์์ผ๋ก ์งํํ๋ฉด 9์ 10์ผ๋ก ๋๋ ์ง๊ณ 1๊ฐ์ฉ ์์๊ฐ ๋จ์๋ค๋ฉด ํฉ์ณ์ค๋๋ค. (์ด๋์ ๋ถํ ์ ๋ณต ๋ฐฉ์์ ๋๋ค.)
์ด๋ฒ์ ์ผ์ชฝ์ ๋นจ๊ฐ ๋ฐ์ค๋ฅผ ํต์ ๋ ฌ ๋ฐฉ์์ผ๋ก ์งํํด์ฃผ๋ฉด 6,7 ๊ทธ๋ฆฌ๊ณ 8์ด ๋จ๊ฒ๋ ๊ฒ ์ ๋๋ค.
6๊ณผ 7์ ํต์ ๋ ฌ ๋ฐฉ์์ผ๋ก ๋๋ ์ฃผ๊ณ ํฉ์ณ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ ํฉ์ณ์ง ์์๋ค์ ๋ชจ๋ ํฉ์ณ์ค๋๋ค.
์ด๋ฒ์ ์์ ๊ฐ๋ค์ด์๋ ํ๋ ๋ฐ์ค๋ฅผ ์งํํ๋ฉด
2,1,3๊ณผ 4,5๋ก ๋๋ ์ง๊ณ
1,2์ 3์ผ๋ก ๋๋ ์ง๊ณ 4์ 5๊ฐ ํฉ์ณ์ง๊ฒ ์ฃ ?
์ด์ ์ผ์ชฝ์ ๋ชจ๋ ๊ฐ์ ํฉ์ณ์ค๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ ์ ํฉ์ณ๋๋ ์ค๋ฅธ์ชฝ์ ๊ฐ๋ค๊ณผ ์ผ์ชฝ ๊ฐ๋ค์ ๋ชจ๋ ํฉ์ณ์ค๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ค๋ฆ์ฐจ์์ผ๋ก ๋ชจ๋ ์์๊ฐ ์ ๋ ฌ๋ฉ๋๋ค.
ํต ์ ๋ ฌ ๊ณผ์ ์ ์ด๋ฏธ์ง๋ก ๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
์๊ฐ ๋ณต์ก๋ โฐ
ํต ์ ๋ ฌ์ ์ด๋ค ๊ฒ์ ํผ๋ด์ผ๋ก ์ ํํ๋์ง์ ๋ฐ๋ผ์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ฌ๋ผ์ง๋๋ค.
๋ง์ฝ 1,2,3,4,5,6,7,8,9,10์ด ์๊ณ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ 10์ ํผ๋ด์ผ๋ก ์ ํํ๋ค๋ฉด ์ต์ ์ ๊ฒฝ์ฐ์ธ O(n²) ์ ๋๋ค.
ํ์ง๋ง ํ๊ท ์ ์ธ ์ํ์๊ฐ์ nlogn ์ ๋๋ค.
์ฝ๋ ๊ตฌํ ๐จ๐ป๐ป
๋จผ์ ๋ถํ ํ๋ ๋ฐฉ๋ฒ์ ์ฝ๋๋ก ๊ตฌํํ๊ฒ ์ต๋๋ค.
๋จผ์ ํผ๋ด,์ผ์ชฝ,์ค๋ฅธ์ชฝ ์ธ๋ฑ์ค ๊ฐ์ ์ ํด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ฌ ์์ง์ฌ์ผํ ํฌ์ธํฐ๊ฐ ์ผ์ชฝ์ธ์ง ์ค๋ฅธ์ชฝ์ธ์ง ์๋ ค์ค ๋ณ์๋ ์ ํด์ค๋๋ค.
๋ง์ฝ ์์๊ฐ 1๊ฐ๋ง ๋จ์๋ค๋ฉด ์์๋ค์ ๊ทธ๋๋ก ๋ฐํํด์ค๋๋ค.
func divide(_ list:[Element]) -> [Element] {
if list.count < 2 { return list }
var newList:[Element] = list
let pivotIndex:Int = newList.count/2-1
var leftIndex:Int = 0
var rightIndex:Int = newList.count-1
var isLeft:Bool = true
...
์์์ ๊ตฌํํ๋๋๋ก ์ผ์ชฝ ํฌ์ธํฐ์ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ ๊ฒน์น ๋๊น์ง ํฌ์ธํฐ๋ฅผ ์์ง์ฌ์ค๋๋ค.
์์ง์ฌ์ผํ ํฌ์ธํฐ๊ฐ ์ผ์ชฝ์ด๋ผ๋ฉด ํผ๋ด์ ๊ฐ๊ณผ ๋น๊ตํด์ ๋ ์๋ค๋ฉด ํฌ์ธํฐ๋ฅผ +1 ํด์ฃผ๊ณ ๋ ํฌ๋ค๋ฉด ํผ๋ด๊ฐ๊ณผ ์ผ์ชฝ ๊ฐ์ ๋ฐ๊ฟ์ค๋๋ค.
์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ผ๋ฉด ํผ๋ด์ ๊ฐ๊ณผ ๋น๊ตํด์ ๋ ํฌ๋ค๋ฉด ํฌ์ธํฐ๋ฅผ +1 ํด์ฃผ๊ณ ๋ ์๋ค๋ฉด ํผ๋ด๊ฐ๊ณผ ์ค๋ฅธ์ชฝ ๊ฐ์ ๋ฐ๊ฟ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ ์์ง์ฌ์ผํ ํฌ์ธํฐ๋ฅผ toggle๋ก ๋ฐ๊ฟ์ค๋๋ค.
while leftIndex < rightIndex {
if isLeft {
if newList[leftIndex] < newList[pivotIndex] {
leftIndex += 1
}else {
newList.swapAt(pivotIndex, leftIndex)
}
}else {
if newList[rightIndex] > newList[pivotIndex] {
rightIndex -= 1
}else {
newList.swapAt(pivotIndex, rightIndex)
}
}
isLeft.toggle()
}
๋ง์ง๋ง์ผ๋ก ๊ฒน์น ํฌ์ธํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋ ์ค ๋ค ์ฌ๊ทํจ์๋ก ๋ฐ๋ณตํด์ค๋๋ค.
let left:[Element] = Array(newList[0...leftIndex])
let right:[Element] = Array(newList[leftIndex+1..<newList.count])
return merge(divide(left),divide(right))
}
์์๊ฐ 1๊ฐ๊ฐ ๋จ์ ๋์ง ๋ชจ๋ ๋ถํ ํ๋ค๋ฉด ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ํฉ์ณ์ค๋๋ค.
func merge(_ left:[Element],_ right:[Element]) -> [Element] {
return left + right
}
Source Code
'๐ฅ Computer Science > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ์์์ ๊ด๋ จ๋ ์๊ณ ๋ฆฌ์ฆ(feat. ์๋ผํ ์ค ํ ๋ค์ค์ ์ฒด) (0) | 2022.01.19 |
---|---|
[Algorithm] ๋์ ๊ณํ๋ฒ(Dynamic Programming)์ด๋? (0) | 2021.12.09 |
[Algorithm] ํ ์ ๋ ฌ(HeapSort)์ด๋? (feat.Swift) (0) | 2021.10.19 |
[Algorithm] ํฉ๋ณ ์ ๋ ฌ(Merge Sort)๋? (feat. Swift) (0) | 2021.10.14 |
[Algorithm] ์๊ฐ๋ณต์ก๋(Time-Complexity)๋? (feat. Big O) (0) | 2021.09.29 |
๋๊ธ