๐Ÿ’ป CS/์•Œ๊ณ ๋ฆฌ์ฆ˜

[Swift] (๋ถ„ํ•  ์ •๋ณต) ํ€ต ์ •๋ ฌ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

JerryiOS 2023. 4. 3. 16:32

์ด๊ธ€์€ ๋น„์ „๊ณต์ž ์ทจ์ค€์ƒ์ด ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ https://babbab2.tistory.com/101 ์ด๊ณณ์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”!

๋ชจ๋“  ์ด๋ฏธ์ง€์˜ ์ถœ์ฒ˜๋Š” ์œ„์˜ ํ‹ฐ์Šคํ† ๋ฆฌ์ž„์„ ๋ฐํž™๋‹ˆ๋‹ค.

๋ถ„ํ•  ์ •๋ณต

๋ฌธ์ œ๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋‚˜๋ˆ„์–ด์„œ ํ’€๊ณ , ๋‚˜๋ˆ„์–ด์„œ ํ‘ผ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ•ฉ๋ณ‘ํ•˜์—ฌ ๋‹ต์„ ์–ป๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ•˜์–‘์‹ ์ ‘๊ทผ๋ฒ•์œผ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

ํ€ต ์ •๋ ฌ

ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ pivot(๊ธฐ์ค€์ )์„ ๊ธฐ์ค€์œผ๋กœ 2๊ฐœ์˜ ๋น„๊ท ๋“ฑํ•œ ํฌ๊ธฐ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ๋ถ„ํ• ๋œ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•œ ๋‹ค์Œ,

2๊ฐœ์˜ ์ •๋ ฌ๋œ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•ฉํ•˜์—ฌ ์ „์ฒด๊ฐ€ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋˜๊ฒŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ๋ฐฐ์—ด์„ ๋ถ„ํ• ํ•˜๊ณ  ์ •๋ ฌํ•œ ๋‹ค์Œ, ๋‹ค์‹œํ•ฉ์น˜๋Š” ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

ํ€ต์ •๋ ฌ์˜ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ๊ธฐ์ค€์ (pivot)์„ ์ •ํ•ด์„œ, ๊ธฐ์ค€์ ๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋Š” ์™ผ์ชฝ(left), ํฐ ๋ฐ์ดํ„ฐ๋Š” ์˜ค๋ฅธ์ชฝ(right)์œผ๋กœ ๋ชจ์๋‹ˆ๋‹ค.
2. ์œ„์—์„œ ๋ชจ์€ ์™ผ์ชฝ(left), ์˜ค๋ฅธ์ชฝ(right)์˜ ๊ฐฏ์ˆ˜๊ฐ€ 1๊ฐœ ์ดํ•˜๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ์œ„ ์ž‘์—…์„ ์žฌ๊ท€๋กœ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
3. ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ์™ผ์ชฝ(left) + ๊ธฐ์ค€์ (pivot) + ์˜ค๋ฅธ์ชฝ(right)์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ์˜ˆ์‹œ

๋จผ์ €, ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ Index๋ฅผ pivot(๊ธฐ์ค€์ )์œผ๋กœ ์žก์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  pivot๋ณด๋‹ค ์ž‘์€ ์š”์†Œ๋“ค์€ ์™ผ์ชฝ(left)์ด๋ผ๋Š” ๋ฐฐ์—ด์—, ํฐ ์š”์†Œ๋“ค์€ ์˜ค๋ฅธ์ชฝ(right)๋ผ๋Š” ๋ฐฐ์—ด์— ๋ชจ์๋‹ˆ๋‹ค.

์ด ๋‚˜๋ˆ ๋†“์€ left, right ๋ฐฐ์—ด์„ ๋‹ค์‹œ ์žฌ๊ท€์‹œํ‚ต๋‹ˆ๋‹ค. (๋‚˜๋ˆ ์ง„ left, right์˜ ๊ฐฏ์ˆ˜๊ฐ€ 1๊ฐœ ์ดํ•˜๊ฐ€ ๋  ๋•Œ๊นŒ์ง€)

๊ฐ๊ฐ์˜ left ๋ชจ์Œ์ด ๊ฐฏ์ˆ˜ 1๊ฐœ๊ฐ€ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€์˜ ํƒˆ์ถœ ์กฐ๊ฑด์— ์˜ํ•ด ๋”์ด์ƒ ์žฌ๊ท€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ œ return ์กฐ๊ฑด์— ๋”ฐ๋ผ left + pivot + right๊ฐ€ return ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ฐจ๋ก€๋Œ€๋กœ ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ return๋˜๋‹ค๋ณด๋ฉด, ๋งˆ์ง€๋ง‰์—๋Š” ์ตœ์ข…์ ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์ด return๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋กœ ๊ตฌํ˜„

func quickSort(_ array: [Int]) -> [Int] {
    guard let first = array.first, array.count > 1 else { return array }
 
    let pivot = first
    let left = array.filter { $0 < pivot }
    let right = array.filter { $0 > pivot }
    
    return quickSort(left) + [pivot] + quickSort(right)
}

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

ํ€ต ์ •๋ ฌ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(nlogn)์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์ฒซ๋ฒˆ์งธ index์ธ pivot์ด ๊ฐ€์žฅ ํฌ๊ฑฐ๋‚˜ ๊ฐ€์žฅ ์ž‘์œผ๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•ด์•ผํ•ด์„œ O(n^2)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•