[Algorithm] ํต ์ ๋ ฌ(Quick Sort) ์๊ณ ๋ฆฌ์ฆ ํบ์๋ณด๊ธฐ
ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋
ํต ์ ๋ ฌ์ ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ(๋ฌธ์ ๋ฅผ ๋ ์์ 2๊ฐ์ ๋ฌธ์ ๋ก ๋ถ๋ฆฌํด์ ํด๊ฒฐํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ)์ ํ๋๋ก ์ฐฐ์ค ์คํฐ๋ ๋ฆฌ์ฒ๋ ํธ์ด(Charles Antony Richard Hoare)๊ธฐ์ฌ๊ฐ ๊ฐ๋ฐํ๋ค. ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋น ๋ฅธ ์ํ ์๋๊ฐ ํน์ง์ด๋ค. ๊ธฐ๋ณธ์ ์ธ ํต ์ ๋ ฌ์ ์๋ 3๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ์ ๋ ฌํ๋ค.
- ๊ธฐ์ค(Pivot; ํผ๋ฒ) ์์ ์ ํ — ์ฃผ๋ก ๋ฐฐ์ด์ ์ค๊ฐ ์์๋ฅผ ๊ธฐ์ค์ผ๋กํจ
- ๊ธฐ์ค ์์๋ณด๋ค ์์ ์์๋ ์ผ์ชฝ์ผ๋ก ์ด๋, ๊ธฐ์ค ์์๋ณด๋ค ํฐ ์์๋ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
- ์ด๋์ํจ ์ผ์ชฝ / ์ค๋ฅธ์ชฝ ์์๋ค์ ๋ํด 1~2๋ฒ ์์ ๋ฐ๋ณต
๊ตฌํ
Basic Quick Sort
๐ก ๊ตฌํํ๊ธฐ ์ฝ์ง๋ง ํญ์ ์๋ก์ด left / right ๋ฐฐ์ด์ ์์ฑํด ๋น๊ตํ ์์๋ฅผ ์ถ๊ฐํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ์ฌํจ
Not in place ๋ฐฉ์ : ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ์ / ์ ๋ ฅ๊ฐ ํด์๋ก ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ์ฌํจ
Stable ๋ฐฉ์ : ์ค๋ณต ๋ฐ์ดํฐ ์์ ์๋ฐ๊ฟ
์งํ ๊ณผ์ ๋ถ์
โดf([85, 24, 63, 45, 17, 31, 96, 50])
=======================================
pivot = 45, arr = [85, 24, 63, 17, 31, 96, 50]
left = [24, 17, 31], right = [85, 63, 96, 50]
concat โตf([24, 17, 31]) + 45 + โบf([85, 63, 96, 50])
---------------------------------------
return [17, 24, 31, 45, 50, 63, 85, 96]
โตf([24, 17, 31])
=======================================
pivot = 17, arr = [24, 31]
left = [], right = [24, 31]
concat โถ[] + 17 + โทf([24, 31])
---------------------------------------
return [17, 24, 31]
โทf([24, 31])
=======================================
pivot = 24, arr = [31]
left = [], right = [31]
concat โธ[] + 24 + โนf([31])
---------------------------------------
return [24, 31]
โบf([85, 63, 96, 50])
=======================================
pivot = 63, arr = [85, 96, 50]
left = [50], right = [85, 96]
concat โปf([50]) + 63 + โผf([85, 96])
---------------------------------------
return [50, 63, 85, 96]
โผf([85, 96]
=======================================
pivot = 85, arr = [96]
left = [], right = [96]
concat โฝ[] + 85 + โพf([96])
---------------------------------------
return [85, 96]
- ๊ธฐ์ค(Pivot; ํผ๋ฒ) ์์ ์ ํ
- ๊ธฐ์ค ์์๋ณด๋ค ์์ ์์๋
left
๋ฐฐ์ด์ ์ถ๊ฐ, ๊ธฐ์ค ์์๋ณด๋ค ํฐ ์์๋right
๋ฐฐ์ด์ ์ถ๊ฐ - ๋ฐฐ์ด ๊ธธ์ด๊ฐ 1์ด ๋ ๋๊น์ง
left
,right
๋ฐฐ์ด์ 1~2๋ฒ ์์ ๋ฐ๋ณต
์ ์ฒด ์ฝ๋
// ์ฝ๋ ์ฐธ๊ณ GitHub @dragon-liu
const quickSort = (array) => {
if (array.length <= 1) return array; // Base Case
// ๋ฐฐ์ด ๋ถํ ์ ์ํ ๊ธฐ์ค ์์ ์ ํ ๋ฐ left, right ํ์ ๋ฐฐ์ด ์์ฑ
const pivotIndex = Math.floor(array.length / 2);
const pivot = array.splice(pivotIndex, 1)[0]; // ํผ๋ฒ ์์
const left = [];
const right = [];
// ํผ๋ฒ ์์๋ณด๋ค ์์ผ๋ฉด left ํ์ ๋ฐฐ์ด์ ์ถ๊ฐ, ํผ๋ฒ ์์๋ณด๋ค ํฌ๋ฉด right ํ์ ๋ฐฐ์ด์ ์ถ๊ฐ
for (let i = 0; i < array.length; i++) {
if (array[i] < pivot) left.push(array[i]);
else right.push(array[i]);
}
// ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ป๊ธฐ ์ํด ์ฌ๊ท ํธ์ถ๋ก ์ ๊ณผ์ ๋ฐ๋ณต
return quickSort(left).concat(pivot, quickSort(right));
};
const sorted = quickSort([85, 24, 63, 45, 17, 31, 96, 50]);
console.log(sorted); // [17, 24, 31, 45, 50, 63, 85, 96]
In Place Quick Sort โญ๏ธ
In place ๋ฐฉ์ : ์ ์๋ฆฌ ์ ๋ ฌ / ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ์ ์์
Unstable ๋ฐฉ์ : ์ค๋ณต ๋ฐ์ดํฐ ์์ ๋ฐ๋ ์ ์์
์งํ ๊ณผ์ ๋ถ์
quickSort
ํจ์ โผ
โด Q([85, 24, 63, 45, 17, 31, 96, 50], 0, 7)
===========================================
b = P([85, 24, 63, 45, 17, 31, 96, 50], 0, 7) -> [P-1] = 4 | [31, 24, 17, 45, 63, 85, 96, 50]
โต Q([31, 24, 17, 45, 63, 85, 96, 50], 0, 3) -> [17, 24, 31, 45, 63, 85, 96, 50]
โผ Q([17, 24, 31, 45, 63, 85, 96, 50], 4, 7) -> [17, 24, 31, 45, 50, 63, 85, 96]
---------------------------------------
return [17, 24, 31, 45, 50, 63, 85, 96]
โต Q([31, 24, 17, 45, 63, 85, 96, 50], 0, 3)
===========================================
b = P([31, 24, 17, 45, 63, 85, 96, 50], 0, 3) -> [P-2] = 2 | [17, 24, 31, 45, 63, 85, 96, 50]
โถ Q([17, 24, 31, 45, 63, 85, 96, 50], 0, 1) -> [17, 24, 31, 45, 63, 85, 96, 50]
โน Q([17, 24, 31, 45, 63, 85, 96, 50], 2, 3) -> [17, 24, 31, 45, 63, 85, 96, 50]
---------------------------------------
return [17, 24, 31, 45, 63, 85, 96, 50]
โถ Q([17, 24, 31, 45, 63, 85, 96, 50], 0, 1)
===========================================
b = P([17, 24, 31, 45, 63, 85, 96, 50], 0, 1) -> [P-3] = 1 | Swap ์์
โท Q([17, 24, 31, 45, 63, 85, 96, 50], 0, 0) -> Base case return
โธ Q([17, 24, 31, 45, 63, 85, 96, 50], 1, 1) -> Base case return
---------------------------------------
return [17, 24, 31, 45, 63, 85, 96, 50]
โน Q([17, 24, 31, 45, 63, 85, 96, 50], 2, 3)
===========================================
b = P([17, 24, 31, 45, 63, 85, 96, 50], 2, 3) -> [P-4] = 3 | Swap ์์
โบ Q([17, 24, 31, 45, 63, 85, 96, 50], 2, 2) -> Base case return
โป Q([17, 24, 31, 45, 63, 85, 96, 50], 3, 3) -> Base case return
---------------------------------------
return [17, 24, 31, 45, 63, 85, 96, 50]
โผ Q([17, 24, 31, 45, 63, 85, 96, 50], 4, 7)
===========================================
b = P([17, 24, 31, 45, 63, 85, 96, 50], 4, 7) -> [P-5] = 6 | [17, 24, 31, 45, 63, 50, 96, 85]
โฝ Q([17, 24, 31, 45, 63, 50, 96, 85], 4, 5) -> [17, 24, 31, 45, 50, 63, 96, 85]
โ Q([17, 24, 31, 45, 50, 63, 96, 85], 6, 7) -> [17, 24, 31, 45, 50, 63, 85, 96]
---------------------------------------
return [17, 24, 31, 45, 50, 63, 85, 96]
โฝ Q([17, 24, 31, 45, 63, 50, 96, 85], 4, 5)
===========================================
b = P([17, 24, 31, 45, 63, 50, 96, 85], 4, 5) -> [P-6] = 5 | [17, 24, 31, 45, 50, 63, 96, 85]
โพ Q([17, 24, 31, 45, 50, 63, 96, 85], 4, 4) -> Base case return
โฟ Q([17, 24, 31, 45, 50, 63, 96, 85], 5, 5) -> Base case return
---------------------------------------
return [17, 24, 31, 45, 50, 63, 96, 85]
โ Q([17, 24, 31, 45, 50, 63, 96, 85], 6, 7)
===========================================
b = P([17, 24, 31, 45, 50, 63, 96, 85], 6, 7) -> [P-7] = 7 | [17, 24, 31, 45, 50, 63, 85, 96]
โ Q([17, 24, 31, 45, 50, 63, 85, 96], 6, 6) -> Base case return
โ Q([17, 24, 31, 45, 50, 63, 85, 96], 7, 7) -> Base case return
---------------------------------------
return [17, 24, 31, 45, 50, 63, 85, 96]
๋ฐฐ์ด์ ๋๋๋ ๊ธฐ์ค ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ partition
ํจ์ / start, end ๋ฒ์ ๋ด์์ ์ ๋ ฌ๋ ์ด๋ค์ง โผ
[P-1] P([85, 24, 63, 45, 17, 31, 96, 50], 0, 7)
===============================================
pivot = 45, i = 0, j = 7
------------------------
while (0 <= 7)
85 < 45 (x) : i = 0
50 > 45 (-1) -> 96 > 45 (-1) -> 31 > 45 (x) : j = 5
if (0 <= 5) -> swap 85/31 -> [31, 24, 63, 45, 17, 85, 96, 50] -> i = 1, j = 4
------------------------
while (1 <= 4)
24 < 45 (+1) -> 63 < 45 (x) : i = 2
17 > 45 (x) : j = 4
if (2 <= 4) -> swap 63/17 -> [31, 24, 17, 45, 63, 85, 96, 50] -> i = 3, j = 3
------------------------
while (3 <= 3)
45 < 45 (x) : i = 3
45 > 45 (x) : j = 3
if (3 <= 3) -> swap 45/45 -> [31, 24, 17, 45, 63, 85, 96, 50] -> i = 4, j = 2
------------------------
return 4
[P-2] P([31, 24, 17, 45, 63, 85, 96, 50], 0, 3)
===============================================
pivot = 24, i = 0, j = 3
------------------------
while (0 <= 3)
31 < 24 (x) : i = 0
45 > 24 (-1) -> 17 > 24 (x) : j = 2
if (0 <= 2) -> swap 31/17 -> [17, 24, 31, 45, 63, 85, 96, 50] -> i = 1, j = 1
------------------------
while (1 <= 1)
24 < 24 (x) : i = 1
24 > 24 (x) : j = 1
if (1 <= 1) -> swap 24/24 -> [17, 24, 31, 45, 63, 85, 96, 50] -> i = 2, j = 0
------------------------
return 2
[P-3] P([17, 24, 31, 45, 63, 85, 96, 50], 0, 1)
===============================================
pivot = 17, i = 0, j = 1
------------------------
while (0 <= 1)
17 < 17 (x) : i = 0
24 > 17 (-1) -> 17 > 17 (x) : j = 0
if (0 <= 0) -> swap 17/17 -> [17, 24, 31, 45, 63, 85, 96, 50] -> i = 1, j = -1
------------------------
return 1
[P-4] P([17, 24, 31, 45, 63, 85, 96, 50], 2, 3)
===============================================
pivot = 31, i = 2, j = 3
------------------------
while (2 <= 3)
31 < 31 (x) : i = 2
45 > 31 (-1) -> 31 > 31 (x) : j = 2
if (2 <= 2) -> swap 31/31 -> [17, 24, 31, 45, 63, 85, 96, 50] -> i = 3, j = 1
------------------------
return 3
[P-5] P([17, 24, 31, 45, 63, 85, 96, 50], 4, 7)
===============================================
pivot = 85, i = 4, j = 7
------------------------
while (4 <= 7)
63 < 85 (+1) -> 85 < 85 (x) : i = 5
50 > 85 (x) -> j = 7
if (5 <= 7) -> swap 85/50 -> [17, 24, 31, 45, 63, 50, 96, 85] -> i = 6, j = 6
------------------------
while (6 <= 6)
96 < 85 (x) : i = 6
96 > 85 (-1) -> 50 > 85 (x) : j = 5
------------------------
return 6
[P-6] P([17, 24, 31, 45, 63, 50, 96, 85], 4, 5)
===============================================
pivot = 63, i = 4, j = 5
------------------------
while (4 <= 5)
63 < 63 (x) : i = 4
50 > 63 (x) : j = 5
if (4 <= 5) -> swap 63/50 -> [17, 24, 31, 45, 50, 63, 96, 85] -> i = 5, j = 4
------------------------
return 5
[P-7] P([17, 24, 31, 45, 50, 63, 96, 85], 6, 7)
===============================================
pivot = 96, i = 6, j = 7
------------------------
while (6 <= 7)
96 < 96 (x) : i = 6
85 > 96 (x) : j = 7
if (6 <= 7) -> swap 96/85 -> [17, 24, 31, 45, 50, 63, 85, 96] -> i = 7, j = 6
------------------------
return 7
๊ฒฝ๊ณ ์ธ๋ฑ์ค ์ฐพ๊ธฐ / ํผ๋ฒ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
- ์ฒ์ ํธ์ถํ ๋ ๋ฐฐ์ด ์ฒซ๋ฒ์งธ / ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ๊ฐ๊ฐ
left
(i
),right
(j
)๋ก ์ค์ left
,right
์ธ๋ฑ์ค๋ฅผ ๊ฒฝ๊ณ๋ก ๊ฐ์ด๋ฐ ์์๋ฅผ ํผ๋ฒ์ผ๋ก ์ค์
ex)const pivot = arr[Math.floor((start + end) / 2)]
left
ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์์์ ํผ๋ฒ ์์ ๋น๊ตleft
ํฌ์ธํฐ ์์๊ฐ ํผ๋ฒ ์์๋ณด๋ค ์์ผ๋ฉด ํฌ์ธํฐ ์ฐ์ธก์ผ๋ก ์ด๋ (left
์ธ๋ฑ์ค + 1)- ํผ๋ฒ ์์ ๋ณด๋ค ๋ ํฐ ๊ฐ์ ์ฐพ์๋๊น์ง ๋ฐ๋ณต
right
ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์์์ ํผ๋ฒ ์์ ๋น๊ตright
ํฌ์ธํฐ ์์๊ฐ ํผ๋ฒ ์์๋ณด๋ค ํฌ๋ฉด ํฌ์ธํฐ ์ข์ธก์ผ๋ก ์ด๋ (right
์ธ๋ฑ์ค - 1)- ํผ๋ฒ ์์ ๋ณด๋ค ๋ ์์ ๊ฐ์ ์ฐพ์๋๊น์ง ๋ฐ๋ณต
left
,right
ํฌ์ธํฐ๊ฐ ๊ต์ฐจํ๋์ง ํ์ธ- ๊ต์ฐจ ์ ์ด๋ฉด(
left < right
)- ํผ๋ฒ ์ผ์ชฝ์ ๋ ํฐ ๊ฐ์ด ์๋ ์ํ๋ฏ๋ก
left
โright
์์ ๊ตํ(Swap) - ๋ค์ ๊ฒ์์ ์ํด
left + 1
,right - 1
- ํผ๋ฒ ์ผ์ชฝ์ ๋ ํฐ ๊ฐ์ด ์๋ ์ํ๋ฏ๋ก
- ์ด๋ฏธ ๊ต์ฐจ ํ์ ๋๋(
left === right
) ๊ฒฝ๊ณ ์ธ๋ฑ์ค ์ค์ ์ ์ํด ์กฐ๊ฑด ํต๊ณผ ํ ์ธ๋ฑ์ค ์ด๋
- ๊ต์ฐจ ์ ์ด๋ฉด(
left
๊ฐright
๋ณด๋ค ์ปค์ง๋๊น์ง 3~5 ๊ณผ์ ๋ฐ๋ณต. ์ปค์ก๋ค๋ฉดleft
๋ฐํํ๊ณ ๊ฒฝ๊ณ ์ธ๋ฑ์ค๋ก ์ฌ์ฉ
๊ฒฝ๊ณ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด ๋ถํ ํ ์ํ ํธ์ถ
๐ก start์ end ์ธ๋ฑ์ค๊ฐ ๊ฐ์๋๊น์ง ์์ ๋ฐ๋ณต
์ข์ธก ๋ฐฐ์ด : start
(ํญ์ ๋์ผ) ~ borderIndex - 1
// ๊ฒฝ๊ณ ์ธ๋ฑ์ค ์ข์ธก์ ๋ถํ ๊ณผ์
// start 0 | end 7 | bdx 4 (borderIndex)
[1, 2, 3, 4, 5, 6, 7, 8]
// start 0 | end 3 (์ด์ bdx - 1) | bdx 2
[1, 2, 3, 4, (5), (6), (7), (8)]
// start 0 | end 1 (์ด์ bdx - 1) | bdx 1
[1, 2, (3), (4), (5), (6), (7), (8)]
// start 0 | end 0 (์ด์ bdx - 1) -> start === end
[1, (2), (3), (4), (5), (6), (7), (8)]
์ฐ์ธก ๋ฐฐ์ด : borderIndex
~ end
(ํญ์ ๋์ผ)
// ๊ฒฝ๊ณ ์ธ๋ฑ์ค ์ฐ์ธก์ ๋ถํ ๊ณผ์
// start 0 | end 7 | bdx 4 (borderIndex)
[1, 2, 3, 4, 5, 6, 7, 8]
// start 4 (์ด์ bdx) | end 7 | bdx 6
[(1), (2), (3), (4), 5, 6, 7, 8]
// start 6 (์ด์ bdx) | end 7 | bdx 7
[(1), (2), (3), (4), (5), (6), 7, 8]
// start 7 (์ด์ bdx) | end 7 -> start === end
[(1), (2), (3), (4), (5), (6), (7), 8]
์ ์ฒด ์ฝ๋
// ๋ฐฐ์ด๊ณผ a, b ์ธ๋ฑ์ค๋ฅผ ์ธ์๋ก ๋ฐ์ ๋ฐฐ์ด[a] ๋ฐฐ์ด[b] ์์๋ฅผ ๋ฐ๊พธ๋ ํจ์
const swap = (arr, a, b) => {
/* const temp = arr[a];
arr[a] = arr[b];
arr[b] = temp; */
[arr[a], arr[b]] = [arr[b], arr[a]];
};
// Hoare ๋ถํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ํต ์ ๋ ฌ - ์ฝ๋ ์ฐธ๊ณ https://bit.ly/3QjduFC
function quickSort(arr, start = 0, end = arr.length - 1) {
if (start >= end) return; // Base Case
const borderIndex = partition(arr, start, end); // ๋ฐฐ์ด์ ๋๋๋ ๊ฒฝ๊ณ ์ธ๋ฑ์ค
quickSort(arr, start, borderIndex - 1); // borderIndex ์ผ์ชฝ ์์
quickSort(arr, borderIndex, end); // borderIndex ์ค๋ฅธ์ชฝ ์์
return arr;
}
function partition(arr, start, end) {
const pivot = arr[Math.floor((start + end) / 2)]; // ๊ฐ์ด๋ฐ ์์๋ฅผ pivot์ผ๋ก ์ค์
let i = start; // ์ผ์ชฝ ํฌ์ธํฐ
let j = end; // ์ค๋ฅธ์ชฝ ํฌ์ธํฐ
// i/j ํฌ์ธํฐ๊ฐ ๊ต์ฐจํ ๋๊น์ง ๋ฐ๋ณต(๊ต์ฐจ ์ ์ด๋ผ๋ฉด pivot ์ผ์ชฝ์ ๋ ํฐ ๊ฐ์ด ๋จ์ ์๋ ์ํ)
while (i <= j) {
while (arr[i] < pivot) i++; // ๋ฐฐ์ด ์ผ์ชฝ๋ถํฐ pivot ๊ฐ ๋ณด๋ค ํฐ ์์์ ์ธ๋ฑ์ค ๊ฒ์
while (arr[j] > pivot) j--; // ๋ฐฐ์ด ์ค๋ฅธ์ชฝ๋ถํฐ pivot ๊ฐ ๋ณด๋ค ์์ ์์์ ์ธ๋ฑ์ค ๊ฒ์
// i/j ํฌ์ธํฐ๊ฐ ๊ต์ฐจ์ ์ด๋ผ๋ฉด
if (i <= j) {
// i < j : i ์ธ๋ฑ์ค ์์๊ฐ j ์ธ๋ฑ์ค ์์๋ณด๋ค ๋ณด๋ค ํฐ ๊ฐ์ด๋ฏ๋ก swap ํ ์ธ๋ฑ์ค ์ด๋
// i = j : ์ด๋ฏธ ๊ต์ฐจ ํ์๋๋ ๋ค์ ๊ฒฝ๊ณ ์ธ๋ฑ์ค๋ฅผ ์ํด i/j swap ํ ์ธ๋ฑ์ค ์ด๋
swap(arr, i, j);
i++; // ๋ค์ ๊ฒ์์ ์ํด i + 1
j--; // ๋ค์ ๊ฒ์์ ์ํด i - 1
}
}
return i; // ๊ต์ฐจ ํ์ i ์ธ๋ฑ์ค๋ฅผ ๋ค์ ๊ฒฝ๊ณ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๋ฆฌํด
}
๋ก๊ทธ(Logarithm) ์ฐธ๊ณ ๋ด์ฉ
์๊ฐ ๋ณต์ก๋์์ ๋ก๊ทธ๋ ๋ฐ(base)์ ํ๊ธฐํ์ง ์์ง๋ง, ๋ฐ์ด 2์ธ ๋ก๊ทธ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค(logโN)
.
- ๋ก๊ทธ๋ ์ง์(exponent)์ ์ ๋ฐ๋ ๊ฐ๋
. 2๋ฅผ ๋ช ๋ฒ ๊ฑฐ๋ญ์ ๊ณฑํด์ผ 32๊ฐ ๋์ค๋์ง ๊ณ์ฐํ๋๊ฒ ์ง์, 32๋ 2๋ฅผ ๋ช ๋ฒ ๋๋ ์ผ 1์ด ๋์ค๋์ง ๊ณ์ฐํ๋๊ฒ ๋ก๊ทธ. ์ฐธ๊ณ ๋ก ๋ก๊ทธ๋ ์ง์ ๋ฐฉ์ ์์ผ๋ก ๋ฐ๊ฟ์ ๊ณ์ฐํ๋ฉด ํธํจ(
logโ(b)
→a
๋ฅผ ๋ช ๋ฒ ์ ๊ณฑํด์ผb
๊ฐ ๋์ฌ์ง ๊ณ์ฐํด๋ณธ๋ค).- ์ง์ :
2โฟ = 32
→ 32๋ 2๋ฅผ 5๋ฒ ๊ฑฐ๋ญ์ ๊ณฑํด์ผ ๋์ค๋ฏ๋กn = 5
- ๋ก๊ทธ :
logโ(32) = n
→ 32๋ 2๋ฅผ 5๋ฒ ๋๋ ์ผ 1์ด ๋์ค๋ฏ๋กn = 5
- ์ง์ :
- ์ฆ,
O(logN)
์ ๋ฐ์ดํฐ ์์๊ฐN
๊ฐ ์์ ๋ ์๊ณ ๋ฆฌ์ฆ์ดlogโN
๋จ๊ณ๊ฐ ๊ฑธ๋ฆฐ๋ค๋ ์๋ฏธ. ์์๊ฐ 8๊ฐ๋ผ๋ฉดlogโ8 = 3
์ด๋ฏ๋กO(logN)
์๊ณ ๋ฆฌ์ฆ์ 3๋จ๊ณ๊ฐ ํ์ํ ๊ฒ์ผ๋ก ํด์ํ ์ ์๋ค.
์๊ฐ ๋ณต์ก๋
โถ Worst Case(์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ต์ or ์ต๋๊ฐ์ ํผ๋ฒ์ผ๋ก ์ฌ์ฉํ์ ๋) : O(n²)
์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ต์ ํน์ ์ต๋๊ฐ์ ํผ๋ฒ์ผ๋ก ์ง์ ํ๋ฉด, ๋ฐฐ์ด์ ๋๋๋ ๊ฒฝ๊ณ ์ธ๋ฑ์ค๊ฐ ํญ์ ์ฒซ๋ฒ์งธ ํน์ ๋ง์ง๋ง์ด๊ธฐ ๋๋ฌธ์ ๋ฆฌ์คํธ์ ๋ถ๊ท ํ ๋ถํ ๋ก ์ธํด n๋ฒ ๋งํผ ์ํํธ์ถํ๋ค. ๊ฐ ์ํํธ์ถ๋ง๋ค ๋ฆฌ์คํธ์ ๋ชจ๋ ์์๋ฅผ ๋น๊ตํ๋ฏ๋ก O(n²)
์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
โท Best / Average Case(์ ๋ ฌ์ด ์๋์ ๋) : O(nlogโn)
์ํ ํธ์ถ์ ๊น์ด (์ฌ๊ท ํธ์ถ์ ๊น์ด)
- ๋ ์ฝ๋์ ๊ฐ์
n
์ด 2์ ๊ฑฐ๋ญ์ ๊ณฑn = 2^k
์ด๋ผ๊ณ ๊ฐ์ ํ์ ๋ n = 2^3
์2^3
,2^2
,2^1
,2^0
์์ผ๋ก ์ค์ด๋ค์ด ์ํ ํธ์ถ์ ๊น์ด๊ฐ 3์์ ์ ์ ์๋ค- ์๋ฅผ ํ ๋๋ก
n = 2^k
์ ์ผ๋ฐํํ๋ฉดk(k = logโn)
์์ ์ ์ ์๋ค →k = logโn
$k = logโn$ (๋ฐ์ดํฐ ๊ธธ์ด
n
์ด 8์ด๋ผ๊ณ ๊ฐ์ , 8์ 2๋ฅผ 3๋ฒ ์ ๊ณฑํด์ผ ๋์ค๋ฏ๋ก ์ฌ๊ท ํธ์ถ์ ๊น์ดk
๋ 3)
๋ณํฉ ์ ๋ ฌ ๋ฐ ํต ์ ๋ ฌ์ ๋ฐ์ดํฐ ๊ธธ์ด๊ฐ 1์ด ๋ ๋๊น์ง ์ ๋ฐ์ฉ ๋ถํ ํ๋ค. ๋ฐ์ดํฐ ๊ธธ์ด๊ฐ 8์ด๋ผ๋ฉด 4(8/2)
→ 2(4/2)
→ 1(2/2)
๋ถํ ๊ณผ์ ์ ๊ฑฐ์น๋ฏ๋ก ๊น์ด๋ 3์ด ๋๋ค. [21, 10, 12, 20, 25, 13, 15, 22]
๋ฐฐ์ด์ ์๋ฅผ ๋ค์ด๋ณด๋ฉด…
- 1 depth :
8 / 2 = 4
→n / 2
ํฌ๊ธฐ์ ๋ถ๋ถ ๋ฐฐ์ด 1์ ๋น๊ต (๋ถ๋ถ ๋ฐฐ์ด ๊ฐ์ 2๊ฐ)- (
[21, 10, 12, 20]
— L [25, 13, 15, 22]
)โ — R
- (
- 2 depth :
4 / 2 = 2
→n / 4
ํฌ๊ธฐ์ ๋ถ๋ถ ๋ฐฐ์ด 2์ ๋น๊ต (๋ถ๋ถ ๋ฐฐ์ด ๊ฐ์ 4๊ฐ)- (
[21, 10]
[12, 20]
)โ — L - (
[25, 13]
[15, 22]
)โก — R
- (
- 3 depth :
2 / 2 = 1
→n / 8
ํฌ๊ธฐ์ ๋ถ๋ถ ๋ฐฐ์ด 4์ ๋น๊ต (๋ถ๋ถ ๋ฐฐ์ด ๊ฐ์ 8๊ฐ)- (
[21]
[10]
)โ ([12]
[20]
)โก — L - (
[25]
[13]
)โข ([15]
[22]
)โฃ — R
- (
์ํ ํธ์ถ ๋จ๊ณ์ ๋น๊ต ์ฐ์ฐ
๊ฐ ์ํ(์ฌ๊ท) ํธ์ถ ๋จ๊ณ๋ง๋ค ๋ฆฌ์คํธ์ ๋ชจ๋ ์์๋ฅผ ํผ๋ฒ ์์์ ๋น๊ตํ๋ฏ๋ก ์ด n
๋ฒ์ ๋น๊ต๊ฐ ์ด๋ค์ง๋ค.
๊ฐ ์ํ ํธ์ถ ๋จ๊ณ๋ง๋ค ์ต๋
n
๋ฒ์ ๋น๊ต ์ฐ์ฐ์ ์ํํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋…๊ฐ ์ํ ํธ์ถ ๋จ๊ณ์ ๋น๊ต ์ฐ์ฐ(n) × ์ํ ํธ์ถ ๊น์ด(logโn) = nlogโn
๋ฐ์ดํฐ ๊ธธ์ด๊ฐ 8์ด๋ผ๋ฉด ์ต๋ 24๋ฒ์ ์์ ์ํ
์ฅ๋จ์
Stable ์ ๋ ฌ : ์ค๋ณต ๋ฐ์ดํฐ๋ ์์๋ฅผ ๋ฐ๊พธ์ง ์๋ ๋ฐฉ์(Unstable ์ ๋ ฌ์ ์ค๋ณต ๋ฐ์ดํฐ๋ ์์ ๋ฐ๊ฟ)
In-place ์ ๋ ฌ : ์๋ก์ด ๋ฐฐ์ด ์์ฑ ์์ด ๊ธฐ์กด ๋ฐฐ์ด๋ง ์ฌ์ฉํ๊ฑฐ๋, ์ถฉ๋ถํ ๋ฌด์ํ ๋งํ ์ ์ฅ ๊ณต๊ฐ๋ง ๋ ์ฌ์ฉํ๋ ์ ๋ ฌ ๋ฐฉ์(Not In-place ์ ๋ ฌ์ ์์ ๊ฐ์์ ๋น๋กํ๋ ์ ์ฅ๊ณต๊ฐ์ ๋ ์ฌ์ฉํจ)
- ์ฅ์ (In-place ์ ๋ ฌ ๋ฐฉ์ ๊ธฐ์ค)
- ๋น ๋ฅธ ์ ๋ ฌ ์๋ (
O(nlogโn)
์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋ ๋ค๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค์์ ๊ฐ์ฅ ๋น ๋ฆ) - ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ํจ
- ๋น ๋ฅธ ์ ๋ ฌ ์๋ (
- ๋จ์ (In-place ์ ๋ ฌ ๋ฐฉ์ ๊ธฐ์ค)
- ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ์ต์ or ์ต๋๊ฐ์ ํผ๋ฒ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ํ์๊ฐ ๋ ๊ธธ์ด์ง
- Unstable ์ ๋ ฌ ๋ฐฉ์
๋ ํผ๋ฐ์ค
- [์๊ณ ๋ฆฌ์ฆ] ํต ์ ๋ ฌ(quick sort)์ด๋ - Heee's Development Blog
- QuickSort Algorithm in JavaScript
- ็ฌฌ18็ซ ๆๅบ็ฎๆณ | JavaScript ๆฐๆฎ็ปๆไธ็ฎๆณ
- [JS/Sorting] ํต ์ ๋ ฌ, ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ตฌํํ๊ธฐ (Quick Sort in JavaScript)
- JavaScript๋ก Quick Sort(ํต ์ ๋ ฌ) ๊ตฌํํ๊ธฐ
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[HTML/CSS] Tailwind CSS ๋ค์ด๋๋ฏน ํด๋์ค ์ฌ์ฉ์ ์ฃผ์ํ ์ (0) | 2024.05.08 |
---|---|
[DevTools] 1Password์์ SSH ํค ๊ด๋ฆฌํ๊ธฐ (0) | 2024.05.08 |
[Algorithm] ๋ถํ ์ ๋ณต / ๋ณํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ (0) | 2024.05.07 |
[Algorithm] ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ (๋ฒ๋ธ/์ ํ/์ฝ์ ) (0) | 2024.05.06 |
[React] ๋ฆฌ์กํธ Suspense ํบ์๋ณด๊ธฐ (0) | 2024.05.06 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[HTML/CSS] Tailwind CSS ๋ค์ด๋๋ฏน ํด๋์ค ์ฌ์ฉ์ ์ฃผ์ํ ์
[HTML/CSS] Tailwind CSS ๋ค์ด๋๋ฏน ํด๋์ค ์ฌ์ฉ์ ์ฃผ์ํ ์
2024.05.08 -
[DevTools] 1Password์์ SSH ํค ๊ด๋ฆฌํ๊ธฐ
[DevTools] 1Password์์ SSH ํค ๊ด๋ฆฌํ๊ธฐ
2024.05.08 -
[Algorithm] ๋ถํ ์ ๋ณต / ๋ณํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
[Algorithm] ๋ถํ ์ ๋ณต / ๋ณํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
2024.05.07 -
[Algorithm] ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ (๋ฒ๋ธ/์ ํ/์ฝ์ )
[Algorithm] ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ (๋ฒ๋ธ/์ ํ/์ฝ์ )
2024.05.06