[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)์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

  1. ๋จผ์ € ๋ฐฐ์—ด ๋ชฉ๋ก์—์„œ ํ”ผ๋ฒ—์„ ํ•˜๋‚˜ ๊ณ ๋ฅธ๋‹ค. (์•„๋ฌด๊ฑฐ๋‚˜ ์ƒ๊ด€์—†๋‹ค.)
  2. ๋ฐฐ์—ด์„ ์ญ‰ ๋Œ๋ฉด์„œ ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„œ ์ž‘์€๊ฑธ ์™ผ์ชฝ์—, ํฐ๊ฑธ ์˜ค๋ฅธ์ชฝ์— ๋ชจ์•„๋†“๊ณ  ํ”ผ๋ฒ—์„ ๊ทธ ์ค‘๊ฐ„์— ๋‘”๋‹ค.
  3. ๊ทธ๋Ÿฌ๋ฉด ์–‘์ชฝ์€ ๋ชฐ๋ผ๋„ ํ”ผ๋ฒ— ๋”ฑ ํ•˜๋‚˜์— ๋Œ€ํ•ด์„œ๋Š” ์ •๋ ฌ์‹œ ์œ„์น˜๋ฅผ ์ฐพ์€ ๊ฒƒ์ด๋‹ค.
  4. ๊ทธ๋ž˜์„œ ํ”ผ๋ฒ—์˜ ์ธ๋ฑ์Šค์™€ ์ฐพ๋Š” ๊ฐ’ n์ด ๊ฐ™๋‹ค๋ฉด ๊ฒฐ๊ณผ๋Š” ์ฐพ์€ ์…ˆ์ด๋‹ค.
  5. ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„œ ์™ผ์ชฝ ๋ฐฐ์—ด์ด๋‚˜ ์˜ค๋ฅธ์ชฝ ๋ฐฐ์—ด์„ ๊ฐ€์ง€๊ณ  ๋‹ค์‹œ ์žฌ๊ท€ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค... 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/