๋ฆฌ์คํธ๋ฅผ ์ด๋ค ์์์ ๋ฐ๋ผ ๋ฐฐ์ดํ๋ ๊ฒ - ์ค๋ฆ์ฐจ์, ๋ด๋ฆผ์ฐจ์, ์ํ๋ฒณ ์ ,, ๋ฑ๋ฑ
โ๏ธ Internal sorting
์ฃผ๊ธฐ์ต์ฅ์น์์ ๋ค๋ฃฐ ์ ์๋ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์กด์ Sorting
โ๏ธ External sorting
์
๋ ฅ ํฌ๊ธฐ๊ฐ ๋๋ฌด ์ปค์ ๋ณด์กฐ ๊ธฐ์ต ์ฅ์น์ ์ ์ฅํ ์ ๋ฐ์ ์๋ ์ํ์์ Sorting ํ๋ ๊ฒ
์๋ฅผ ๋ค์ด ์ฃผ๊ธฐ์ต์ฅ์น๊ฐ ํฌ๊ธฐ๊ฐ 1GB๊ณ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ 100GB๋ฉด ์ฃผ๊ธฐ์ต์ฅ์น์ โ
์ด๋ค Internal ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ ์ง์ ์ ๋ ฌํ ์๋ ์์ด ๋ณด์กฐ๊ธฐ์ต์ฅ์น(HDD,SDD)๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ฉด ์
๋ ฅ์ ๋ถํ ํด ์ฃผ๊ธฐ์ต์ฅ์น๊ฐ ์์ฉ ๊ฐ๋ฅํ ๋งํผ์ ๋ฐ์ดํฐ์ ๋ํด ๋ด๋ถ ์ ๋ ฌ์ ์ํํ๊ณ ๋ค์ ์ด๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ณตํ์ฌ, ์ ์ง์ ์ผ๋ก ํฌ๊ธฐ๋ฅผ ๋๋ ค๋๊ฐ๋ ๋ฐฉ์์ ๊ณ ๋ คํด์ผ ํ๋ค.
โ ์ต์ ์ O(n) : ๋ชจ๋ ์ ๋ ฌ์ด ๋์ด์๋ ๊ฒฝ์ฐ
โ
์ต์
์ ๊ฒฝ์ฐ๋ O(n^2) : ์ญ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ ๋
(n-1) + (n-2) + .... + 2 + 1 => n(n-1)/2
โ๏ธ ์งง์ ๋ฆฌ์คํธ์๋ ๊ฐ๋จํ๊ณ ์ข์
โ๏ธ ์ด๋ฏธ ๋๋ถ๋ถ sort๋์ด ์์ผ๋ฉด ์ข์
= ์ต์ ์ ๊ฒฝ์ฐ
ํ๋ฒ์ฉ ๋ฐ์ ๋น๊ต๋ฅผ ์ํ๋ฏ๋ก O(n) ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค. ๋ํ, ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ ๋ฐฐ์ด์ ์๋ฃ๋ฅผ ํ๋์ฉ ์ฝ์
/์ ๊ฑฐํ๋ ๊ฒฝ์ฐ์๋, ํ์ค์ ์ผ๋ก ์ต๊ณ ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ๋๋๋ฐ, ํ์์ ์ ์ธํ ์ค๋ฒํค๋๊ฐ ๋งค์ฐ ์ ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ์ดํฐ์ ๊ฐ์๊ฐ n๊ฐ๋ผ๊ณ ํ์ ๋,
n๊ฐ์ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ ๋ ฌํ๋๋ฐ O(n^2) ๋งํผ์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
์ต์ , ํ๊ท , ์ต์
์ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๋ O(n^2) ์ผ๋ก ๋์ผํ๋ค.
โ๏ธ ์ฅ์
โ๏ธ ๋จ์
(n-1) + (n-2) + (n-3) + .... + 2 + 1 => n(n-1)/2
์ด๋ฏ๋ก, O(n^2) ์ด๋ค.
๋ํ, Bubble Sort๋ ์ ๋ ฌ์ด ๋ผ์๋ ์๋ผ์๋, 2๊ฐ์ ์์๋ฅผ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ์ต์ , ํ๊ท , ์ต์
์ ๊ฒฝ์ฐ ๋ชจ๋ ์๊ฐ๋ณต์ก๋๊ฐ O(n^2) ์ผ๋ก ๋์ผํ๋ค.
โ๏ธ ์ฅ์
โ๏ธ ๋จ์
โ Quick sort vs Merge sort
Quick sort : ์ฐ์ ํผ๋ฒ์ ํตํด ์ ๋ ฌ (partition) => ์์ญ์ ์ชผ๊ฐฌ (quick sort)
Merge sort : ์์ญ์ ์ชผ๊ฐค ์ ์๋ ๋งํผ ์ชผ๊ฐฌ (merge sort) => ์ ๋ ฌ (merge)
โ
ํ๋ก์ธ์ค
ํผ๋ฒ ์์๋ ํผ๋ฒ๋ณด๋ค ๊ฐ์ด ์์ ๋ชจ๋ ์์๋ค์ด ์ค๊ณ , ํผ๋ฒ ๋ค์๋ ํผ๋ฒ๋ณด๋ค ๊ฐ์ด ํฐ ๋ชจ๋ ์์๋ค์ด ์ค๋๋ก ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ๋๋ก ๋๋๋ค. ์ด๋ ๊ฒ ๋ฐฐ์ด์ ๋๋ก ๋๋๋ ๊ฒ์ ๋ถํ (Divide) ์ด๋ผ๊ณ ํ๋ค. ๋ถํ ์ ๋ง์น ๋ค์ ํผ๋ฒ์ ๋ ์ด์ ์์ง์ด์ง ์๋๋ค.
๋ถํ ๋ ๋ ๊ฐ์ ์์ ๋ฐฐ์ด์ ๋ํด ์ฌ๊ท(Recursion)์ ์ผ๋ก ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
โ ์ฝ๋
public int partition(int[] array, int left, int right) {
/**
// ์ต์
์ ๊ฒฝ์ฐ, ๊ฐ์ ๋ฐฉ๋ฒ
//์ ๋ ฌํ๊ณ ์ ํ๋ ๋ฐฐ์ด์ด ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋์ด์๊ฑฐ๋ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ๋์ด์์ผ๋ฉด O(n^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
//์ด๋, ๋ฐฐ์ด์์ ๊ฐ์ฅ ์์ ์๋ ๊ฐ๊ณผ ์ค๊ฐ๊ฐ์ ๊ตํํด์ค๋ค๋ฉด ํ๋ฅ ์ ์ผ๋ก๋๋ง ์๊ฐ๋ณต์ก๋ O(nlogโn)์ผ๋ก ๊ฐ์ ํ ์ ์๋ค.
//ํ์ง๋ง, ์ด ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ ํ๋คํด๋ Quick Sort์ ์ต์
์ ์๊ฐ๋ณต์ก๋๊ฐ O(nlogโn)๊ฐ ๋๋ ๊ฒ์ ์๋๋ค.
int mid = (left + right) / 2;
swap(array, left, mid);
*/
int pivot = array[left]; // ๊ฐ์ฅ ์ผ์ชฝ๊ฐ์ ํผ๋ฒ์ผ๋ก ์ค์
int i = left, j = right;
while(i < j) {
while(pivot < array[j]) {
j--;
}
while(i < j && pivot >= array[i]){
i++;
}
swap(array, i, j);
}
array[left] = array[i];
array[i] = pivot;
return i;
}
public void quickSort(int[] array, int left, int right) {
if(left >= right) return;
// ๋ถํ
int pivot = partition();
// ํผ๋ฒ์ ์ ์ธํ 2๊ฐ์ ๋ถ๋ถ ๋ฐฐ์ด์ ๋์์ผ๋ก ์ํ ํธ์ถ
quickSort(array, left, pivot-1); // ์ ๋ณต(Conquer)
quickSort(array, pivot+1, right); // ์ ๋ณต(Conquer)
}
๐ ์ต์ ์ ๊ฒฝ์ฐ
์ด๊ฒ์ ์ผ๋ฐํํ๋ฉด n=2^k์ ๊ฒฝ์ฐ, k(k=logโn) ์ ์ ์ ์ ์๋ค.
๋ฐ๋ผ์, ์ต์ ์ ์๊ฐ๋ณต์ก๋๋ ์ํ ํธ์ถ์ ๊น์ด * ๊ฐ ์ํ ํธ์ถ ๋จ๊ณ์ ๋น๊ต ์ฐ์ฐ = nlogโn
๊ฐ ๋๋ค. ์ด๋ ํ์๋ ๋น๊ต ํ์๋ณด๋ค ์ ์ผ๋ฏ๋ก ๋ฌด์ํ ์ ์๋ค.
๐ ์ต์ ์ ๊ฒฝ์ฐ : ์ ๋ ฌํ๊ณ ์ ํ๋ ๋ฐฐ์ด์ด ์ค๋ฆ์ฐจ์์ด๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ
๋ ์ฝ๋์ ๊ฐ์ n์ด 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ด๋ผ๊ณ ๊ฐ์ (n=2^k)ํ์ ๋, ์ํ ํธ์ถ์ ๊น์ด๋ n ์์ ์ ์ ์๋ค.
๋ฐ๋ผ์, ์ต์ ์ ์๊ฐ๋ณต์ก๋๋ ์ํ ํธ์ถ์ ๊น์ด * ๊ฐ ์ํ ํธ์ถ ๋จ๊ณ์ ๋น๊ต ์ฐ์ฐ = n^2 ๋ค. ์ด๋ ํ์๋ ๋น๊ต ํ์๋ณด๋ค ์ ์ผ๋ฏ๋ก ๋ฌด์ํ ์ ์๋ค.
๐ ํ๊ท ์ ๊ฒฝ์ฐ : T(n) = O(nlogโn)
โ๏ธ ์ฅ์
โ๏ธ ๋จ์
์ฐธ์กฐ : https://gyoogle.dev/blog/algorithm/Quick%20Sort.html