[Algorithm] quick select
quick select๋ ๋ฐฐ์ด์์ ์ ๋ ฌ๋์์ ๊ฒฝ์ฐ์ N๋ฒ์งธ ์์๋ฅผ ๊ฐ์ ธ์ค๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
quick sort์ ๋์ผํ pivot ๊ธฐ๋ฐ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
quick sort๋ฅผ ์๋ค๋ฉด ์ด๊ฒ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค. quick sort์์ ์ ๋ ฌ์ ๊ทธ๋ฅ ํ๋ค ๋ง๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํ๊ท ๋ณต์ก๋๊ฐ O(n)์ด๋ผ์, ๋ฑ ๊ทธ๊ฑฐ๋ง ์ฐพ์ผ๋ฉด ๋๋ ๊ฒฝ์ฐ์ O(nlog2n)์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฐ๋๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๋ค.
๋ค๋ง quick sort์ฒ๋ผ ์ฃ์ง ์ผ์ด์ค์๋ O(N^2)์ ์ฑ๋ฅ์ด ๋์ฌ ์๋ ์๋ค. ๋ฌผ๋ก ๋งค์ฐ ๋๋ฌผ๋ค.
๊ทผ๋ฐ ์ด๊ฑธ ์ค๋ฌด์์ ์ธ์ผ์ด ์๋...? ๋๋ ๋ชป๋ณธ๊ฑฐ๊ฐ๋ค.
๋๋ผ๋ฉด N๋ฒ์งธ ์์๋ฅผ ์ฐพ์ ์ผ์ด ์ฆ์ผ๋ฉด ๊ทธ๋ฅ ํธ๋ฆฌ๋ sorted array ๊ฐ์๊ฑธ ์ธ ๊ฒ ๊ฐ๋ค.
์ฝํ ์ฉ์ธ๋ฏ
์๋ฆฌ
๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ quick sort์ ๋์๋ฐฉ์๊ณผ ์ ์ฌํ๋ค.
๋ถํ ์ ๋ณต(Divide and Conquer)์ด๋ผ๊ณ ๋ ํ๋ค.
- ๋จผ์ ๋ฐฐ์ด ๋ชฉ๋ก์์ ํผ๋ฒ์ ํ๋ ๊ณ ๋ฅธ๋ค. (์๋ฌด๊ฑฐ๋ ์๊ด์๋ค.)
- ๋ฐฐ์ด์ ์ญ ๋๋ฉด์ ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ํด์ ์์๊ฑธ ์ผ์ชฝ์, ํฐ๊ฑธ ์ค๋ฅธ์ชฝ์ ๋ชจ์๋๊ณ ํผ๋ฒ์ ๊ทธ ์ค๊ฐ์ ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์์ชฝ์ ๋ชฐ๋ผ๋ ํผ๋ฒ ๋ฑ ํ๋์ ๋ํด์๋ ์ ๋ ฌ์ ์์น๋ฅผ ์ฐพ์ ๊ฒ์ด๋ค.
- ๊ทธ๋์ ํผ๋ฒ์ ์ธ๋ฑ์ค์ ์ฐพ๋ ๊ฐ n์ด ๊ฐ๋ค๋ฉด ๊ฒฐ๊ณผ๋ ์ฐพ์ ์ ์ด๋ค.
- ๊ฐ์ง ์๋ค๋ฉด ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ํด์ ์ผ์ชฝ ๋ฐฐ์ด์ด๋ ์ค๋ฅธ์ชฝ ๋ฐฐ์ด์ ๊ฐ์ง๊ณ ๋ค์ ์ฌ๊ท ๋ก์ง์ ์ํํ๋ค... 1๋ฒ๋ถํฐ ๋ค์ ๋ฐ๋ณตํ๋ ๊ฒ์ด๋ค. ๋ค๋ง quick sort์ ๋ค๋ฅด๊ฒ ๋ชจ๋ ๊ฑธ ์ ๋ ฌํ ํ์๋ ์์ผ๋ฏ๋ก, ๋์๋น๊ต๋ก ํ์ํ ๋ฐฉํฅ์ผ๋ก๋ง ๋ค์ด๊ฐ๋ฉด ๋๋ค.
์ ์ํ ์ ์, pivot์์ ๊ณ์ ์ต๋๊ฐ์ด๋ ์ต์๊ฐ์ ์ฐ์ผ๋ฉด ์ต์ ์ ์ฑ๋ฅ์ผ๋ก O(N^2)์ด ๋์ฌ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ค๊ฐ ์ ๋ ํฌ๊ธฐ์ ๊ฐ์ด ์กํ์ผ ์ต์ ์ ์ฑ๋ฅ์ด ๋์จ๋ค.
๊ตฌํ
์์ ์ฝ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ค.
ํผ๋ฒ์ ๋ง๋ค๊ณ ๊ทธ ์์ชฝ์ ์ ๋ ฌํด์ฃผ๋ partition ํจ์์, ๊ทธ๊ฑธ ํธ์ถํด์ ๋ถํ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ฌ๊ทํจ์ quick_select๋ก ๋๋์ด ๊ตฌํํ๋ค.
๏ปฟfunction partition(list, left, right) {
let pivot = left; // ์ผ์ชฝ๋ถํฐ ํ์
for (let i = left; i < right; i++) {
if (list[i] < list[right]) {
// swap
const temp = list[i];
list[i] = list[pivot];
list[pivot] = temp;
pivot += 1;
}
}
// swap
const temp = list[pivot];
list[pivot] = list[right];
list[right] = temp;
return pivot;
}function quick_select(list, left, right, n) {
if (left == right) {
return list[left];
}
const pivot = partition(list, left, right);
if (n == pivot) {
return list[n];
} else if (n < pivot) {
return quick_select(list, left, pivot - 1, n);
} else {
return quick_select(list, pivot + 1, right, n);
}
}
๊ทธ๋ฆฌ๊ณ ๋๋ ค๋ณด๊ฒ ๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฐ์ด์ด ์๊ณ ์ธ๋ฑ์ค ๊ธฐ์ค 2๋ฒ์งธ๋ฅผ ์ฐพ๋๋ค๋ฉด
[1,2,3,4,5]์ด๋ฏ๋ก 3์ด ๋์์ผ ํ๋ค.
์ ๋์จ๋ค.
์ฐธ์กฐ
https://ko.m.wikipedia.org/wiki/%ED%80%B5%EC%85%80%EB%A0%89%ED%8A%B8
https://www.daleseo.com/quick-select/