์ ๋ ฌ์ด ํ์ํ ์ด์ = ํ์
๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์๋ค๋ฉด '์ด์ง ํ์'์ ์ฌ์ฉํ ์ ์๋ค. ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ์ ๊ฒฝ์ฐ์์ 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)$์ด ๋๋ค.
๋.