์ƒˆ์†Œ์‹

IN DEPTH CAKE/Coding-WIKI

[๋ชจ์•„ ๋†“๊ณ  ๋งํ•ด๋ณด์ž] ์ •๋ ฌ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • -
๋ฐ˜์‘ํ˜•

 

์ •๋ ฌ์ด ํ•„์š”ํ•œ ์ด์œ  = ํƒ์ƒ‰

๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด '์ด์ง„ ํƒ์ƒ‰'์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ง„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—”์„œ O(log n)์˜ ์„ฑ๋Šฅ์„ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•๋ ฅํ•˜๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ •๋ ฌ์ด ์„ ํ–‰๋˜์–ด์•ผํ•œ๋‹ค.

 

๋Œ€ํ‘œ์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

[Bubble Sort] ํ‰๊ท  ์‹คํ–‰ ์‹œ๊ฐ„ : $O(n^2)$ / ์ตœ์•… ์‹คํ–‰ ์‹œ๊ฐ„ : $O(n^2)$ / ๋ฉ”๋ชจ๋ฆฌ $O(1)$

 

ํ•œ ๋ฒˆ iteration์„ ๋Œ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ •๋ ฌํ•œ๋‹ค. ํ•œ ๋ฒˆ์˜ iteration์—์„œ ์ฒซ๋ฒˆ์งธ, ๋‘๋ฒˆ์งธ๋ฅผ ๋น„๊ต, ๋‘๋ฒˆ์งธ์™€ ์„ธ๋ฒˆ์งธ๋ฅผ ๋น„๊ต ... ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ $n-1$๋ฒˆ์งธ์™€ $n$๋ฒˆ์งธ๋ฅผ ๋น„๊ตํ•จ์œผ๋กœ์จ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ์ •๋ ฌํ•œ ํ›„ ๋‹ค์‹œ ์•ž์—์„œ๋ถ€ํ„ฐ ๋น„๊ตํ•ด์„œ $n-1$๋ฒˆ์งธ ๊ฐ’์„ ์ •๋ ฌํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ์— ๋งค iteration๋งˆ๋‹ค ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋‹ค ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋ฏ€๋กœ ์ตœ๋Œ€ $\frac{n(n-1)}{2}$ ๋ฒˆ์˜ ๋น„๊ต๋ฅผ ํ•ด์•ผํ•œ๋‹ค. ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์ฝ”๋“œ๊ฐ€ ์งง๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๊ต‰์žฅํžˆ ๋น„ํšจ์œจ์ ์ด๋‹ค.

 

for tgt_id in range(0, len(arr)-1):
	for id in range(tgt_id+1, len(arr)):
    	    if arr[tgt_id] > arr[id]:
        	# exchange each other
                arr[tgt_id], arr[id] = arr[id], arr[tgt_id]

 

 

[Selection Sort] ํ‰๊ท  ์‹คํ–‰ ์‹œ๊ฐ„ : $O(n^2)$ / ์ตœ์•… ์‹คํ–‰ ์‹œ๊ฐ„ : $O(n^2)$ / ๋ฉ”๋ชจ๋ฆฌ $O(1)$

๋ฒ„๋ธ” ์ •๋ ฌ์ด ๋น„๊ต ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ณ„์†ํ•ด์„œ ๊ฐ’์„ ๋ฐ”๊ฟ”๋„ฃ๋Š”๋Œ€์‹  selection sort๋Š” ๊ณ„์† ๋ฐ”๊พธ์ง€ ์•Š๊ณ , ์ œ์ผ ์ž‘์€๊ฑฐ๋ฅผ ์ฐพ์•„์„œ ํ•ด๋‹น ์œ„์น˜์— ๊ฐ€์ ธ๋‹ค๋†“๋Š” ํ˜•ํƒœ๋กœ sortingํ•œ๋‹ค. ๊ฒฐ๊ตญ ๋น„๊ต ํšŸ์ˆ˜๋Š” $\frac{n(n-1)}{2}$๋กœ Bubble sort์™€ ๋™์ผํ•˜์ง€๋งŒ, exchange ํšŸ์ˆ˜๊ฐ€ ์ ๋‹ค๋Š” ์ ์—์„œ ๋ฒ„๋ธ” ์ •๋ ฌ๋ณด๋‹ค ํ•ญ์ƒ ์šฐ์ˆ˜ํ•˜๋‹ค.

 

 

[Insertion Sort] ํ‰๊ท  ์‹คํ–‰ ์‹œ๊ฐ„:  $O(n^2)$ / ์ตœ์•… ์‹คํ–‰ ์‹œ๊ฐ„: $O(n^2)$ / ๋ฉ”๋ชจ๋ฆฌ $O(1)$

k๋ฒˆ์งธ ๊ฐ’์„ 1~k-1๊นŒ์ง€์˜ ๊ฐ’๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ ์ ์ ˆํ•œ ์œ„์น˜์— ๋ผ์›Œ๋„ฃ๋Š” ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. Bubble Sort๋‚˜ Selection Sort๊ฐ€ ๋’ค์˜ '์ •๋ ฌ๋˜์ง€ ์•Š์€ ๊ฐ’'๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ ํŠน์ • ์œ„์น˜์˜ ๊ฐ’์„ ์ฐพ๋Š” ๋Œ€์‹ , Insertion sort ๋Š” ํ˜„์žฌ์˜ ์ •๋ ฌ ํƒ€๊ฒŸ์ด ์•ž์— ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฐ’๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ ์–ด๋Š ์œ„์น˜์— ๋„ฃ์„์ง€ ์ฐพ์•„์„œ ๋ผ์›Œ๋„ฃ์–ด์ค€๋‹ค. ์ด ๋•Œ '์ ์ ˆํ•œ ์œ„์น˜์— ๋ผ์›Œ ๋„ฃ๋Š”๋‹ค'๋Š” ํ–‰๋™์€ ํ•ด๋‹น ์œ„์น˜ ์ดํ›„์˜ ๊ฐ’๋“ค์„ ๋’ค๋กœ ๋ฐ€์–ด๋‚ด๋Š” ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฃŒ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ๋’ค๋กœ ๋ฐ€์–ด๋‚ด๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํด ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๊ฒฝ์šฐ์—์„œ๋Š” ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์„๋•Œ๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

 

[Merge Sort] ํ‰๊ท , ์ตœ์•… ์‹คํ–‰์‹œ๊ฐ„: $O(n \log n)$ / ๋ฉ”๋ชจ๋ฆฌ ์ƒํ™ฉ์—๋”ฐ๋ผ ๋‹ค๋ฆ„.

 

์›์†Œ์˜ ์ˆ˜๊ฐ€ 0 ๋˜๋Š” 1์ด ๋ ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ๊ทธ๋ฃน์„ ๋‚˜๋ˆ„๊ณ , ๋‚˜๋ˆ„์–ด์ง„ ์ˆœ์˜ ์—ญ์ˆœ์œผ๋กœ ์›์†Œ๋ฅผ ๋น„๊ต ํ›„ ๋ณ‘ํ•ฉํ•˜๋Š” ํ˜•ํƒœ๋กœ sorting์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ merge sort์˜ ๊ณผ์ •์„ ๋„์‹ํ™”ํ•œ ๊ทธ๋ฆผ์ด๋‹ค.

 

๊ทธ๋ฆผ ์ถœ์ฒ˜: ๋‚˜๋ฌด ์œ„ํ‚ค

void MERGE_SORT(int &arr, beg, end){
	if(beg < end){
		auto mid = (beg + end) / 2
		MERGESORT(arr, beg, mid);
		MERGESORT(arr, mid+1, end);
		MERGE(arr, beg, mid, end);
	}
}

void MERGE(int &arr, int beg, int mid, int end){

	// copy the array value into helper
	int* helperArr = new int[arr.length];
	for(auto i = 0; i < arr.length; ++i){
		helperArr[i] = arr[i];
	}

	int helperLeft = beg;
	int helperRight = mid + 1;
	int curr = beg; // index for target arr

	while(helperLeft <= mid && helperRight <= end){
		
		// compare helperLeft and helperRight
		if(helperArr[helperLeft] < helperArr[helperRight]){
			arr[curr++] = helperArr[helperLeft++];
		}else{
			arr[curr++] = helperArr[helperRight++];
		}
	}

	// move remaining left part of Helper into target array
	for(auto i = 0; i <= mid - helperLeft; ++i){
		arr[curr+i] = helperArr[helperLeft+i];
	}
	
}

 

Heap Sort $O(n \log n)$

Heap ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌํ•˜๊ณ ์žํ•˜๋Š” ์›์†Œ๋“ค์„ ๋ชจ๋‘ heap์— ๋„ฃ๋Š”๋‹ค. Heap์˜ ์ตœ ์ƒ๋‹จ์— ์žˆ๋Š” ๊ฐ’์€ ์ตœ์†Œ ํ˜น์€ ์ตœ๋Œ“๊ฐ’์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— Heap ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ๋ถ€ํ„ฐ popํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ •๋ ฌ๋œ ์›์†Œ๋“ค์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ , ํ‰๊ท ์ ์œผ๋กœ $O(n log n)$ ์ •๋ ฌ์˜ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ ๊ตฌํ˜„์—์„œ๋Š” ํž™์˜ ๋™์ž‘ overhead๋กœ์ธํ•ด quick ์ •๋ ฌ์ด ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. (Heap ์ •๋ ฌ์˜ ๊ฒฝ์šฐ cache๋กœ ์ธํ•œ ์ด๋“์„ ์–ป๊ธฐ ํž˜๋“  ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๋‹ค) 

 

[Quick Sort] ํ‰๊ท  ์‹คํ–‰ ์‹œ๊ฐ„ $O(n \log n)$, ์ตœ์•… ์‹คํ–‰ ์‹œ๊ฐ„ $O(n^2)$, ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋Ÿ‰ $O(\log n)$

ํ‰๊ท ์ ์ธ ์ƒํ™ฉ์—์„œ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ๋‚ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ํ•˜๋‚˜์˜ ๊ฐ’์„ pivot์œผ๋กœ ์‚ผ์•„ ๊ทธ ๋ณด๋‹ค ์ž‘์€ ๊ฒƒ์„ ์•ž์œผ๋กœ, pivot๋ณด๋‹ค ํฐ ๊ฐ’์„ ๋’ค๋กœ ์˜ฎ๊ธด๋‹ค. ๊ทธ๋ฆฌ๊ณ  pivot์„ ๊ธฐ์ค€์œผ๋กœ ์•ž์ชฝ์˜ list์™€ ๋’ท์ชฝ์˜ list๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐ๊ฐ pivot์„ ์‚ผ๊ณ  ์ •๋ ฌํ•œ๋‹ค. ์–ธ๋œป๋ณด๋ฉด Merge Sort์™€ ๋น„์Šทํ•œ ํ˜•ํƒœ์˜ divide & conqure๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ Quick Sort๋Š” Merge Sort์™€ ๋‹ฌ๋ฆฌ ๊ท ๋“ฑํ•œ ํฌ๊ธฐ๋กœ ๋ถ„ํ• ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

pivot์„ ๊ธฐ์ค€์œผ๋กœ ํฐ ๊ฐ’, ์ž‘์€ ๊ฐ’์„ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. pivot์„ ์ œ์™ธํ•œ ๊ฐ’๋“ค์—์„œ low์™€ high๋ฅผ ๊ฐ๊ฐ ์ œ์ผ ์™ผ์ชฝ, ์ œ์ผ ์˜ค๋ฅธ์ชฝ์˜ index๋กœ ์žก๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  low๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ traverseํ•˜๋ฉด์„œ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์œผ๋ฉด ๋ฉˆ์ถ˜๋‹ค. ๋ฐ˜๋Œ€๋กœ high๋Š” ์™ผ์ชฝ์œผ๋กœ traverseํ•˜๋‹ค๊ฐ€ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์œผ๋ฉด ๋ฉˆ์ถ˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  low์™€ high๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๋‘ ๋ฐ์ดํ„ฐ๋Š” ๊ตํ™˜ํ•œ๋‹ค. ์ด ๋™์ž‘์€ low์™€ high๊ฐ€ ์„œ๋กœ๋ฅผ ์ง€๋‚˜์น ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต๋œ๋‹ค. ์ด ๋•Œ ์ง€๋‚˜์นœ ๊ฒฝ์šฐ์˜ high ์ง€์ ์— pivot์„ ์‚ฝ์ž…ํ•œ๋‹ค.

 

์ฐธ๊ณ ๋กœ merge sort์™€ ๋‹ฌ๋ฆฌ, ํ•œ pivot์— ๋Œ€ํ•ด ๋™์ž‘์ด ๋๋‚˜๋ฉด ์ขŒ ์šฐ์˜ list๋Š” sorting๋˜์–ด์žˆ์ง€ ์•Š๋‹ค. ๋‹ค์‹œ ๋งํ•ด merge sort ๋Š” divdie ํ•œ ํ›„ mergeํ•ด๊ฐ€๋ฉด์„œ sortingํ•˜๊ธฐ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ merge ๋‹จ๊ณ„์—์„œ sorting๋œ ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋Š” ๋Œ€์‹  Quick sort๋Š” divide ๋‹จ๊ณ„ ์—†์ด ์ง„ํ–‰๋œ๋‹ค.

 

์žฅ์ :

- ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค (์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ $O(n log n)$์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ค ์ค‘์—์„œ 'ํ‰๊ท ์ ์œผ๋กœ' ๊ฐ€์žฅ ๋น ๋ฅธ ์†๋„๋ฅผ ๋ณด์ธ๋‹ค)

- ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค

๋‹จ์ : 

- pivot์„ ์ž˜๋ชป ๊ณ ๋ฅด๋Š” ๊ฒฝ์šฐ ๋ถˆ๊ท ํ˜•ํ•œ ๋ถ„ํ• ์— ์˜ํ•ด ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

- ๋‹ค์‹œ ๋งํ•ด, ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ sorting๋˜๋Š” ๊ฒฝ์šฐ ๋ถˆ๊ท ํ˜•ํ•œ list๋กœ ์ธํ•ด pivot ์„ ํƒ์˜ ํšŸ์ˆ˜๊ฐ€ n์ด ๋˜๊ณ , ์ด์— ๋”ฐ๋ผ $O(n^2)$์ด ๋œ๋‹ค.

 

 

๋.

 

 

 

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

# ๋กœ๋”ฉ ํ™”๋ฉด ๋™์ž‘ ์ฝ”๋“œ(Code) ์„ค์ •ํ•˜๊ธฐ