ํฉ๋ณ ์ ๋ ฌ (Merge Sort) ์๊ณ ๋ฆฌ์ฆ :
๋ฐฐ์ด์ ์๋ถ๋ถ๊ณผ ๋ท๋ถ๋ถ์ผ๋ก ๋๋์ด ๊ฐ๊ฐ ์ ๋ ฌํ ๋ค์ ๋ณํฉํ๋ ์์ ์ ๋ฐ๋ณตํ์ฌ ์ ๋ ฌ์ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ
int[] merge = {8, 1, 4, 2, 7, 6, 3, 5}
1. ๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋๋ค
2. ์๋ถ๋ถ์ ํฉ๋ณ์ ๋ ฌ๋ก ์ ๋ ฌํ๋ค
3. ๋ท๋ถ๋ถ์ ํฉ๋ณ์ ๋ ฌ๋ก ์ ๋ ฌํ๋ค
4. ์๋ถ๋ถ๊ณผ ๋ท๋ถ๋ถ์ ๋ณํฉํ๋ค
4-1. ์๋ถ๋ถ์ ๋ฐฐ์ด buff์ ๋ณต์ฌ
4-2. ๋ฐฐ์ด buff์ ๋ท๋ถ๋ถ์ ๋ฐฐ์ด a์ ๋ณํฉ
4-3. ๋ฐฐ์ด buff์ ๋๋จธ์ง ์์๋ฅผ ๋ฐฐ์ด a์ ๋ณต์ฌ
๋ฉ์๋ mergeSort() : ๋ฐฐ์ด a์ ํฌ๊ธฐ n๊ณผ ๊ฐ์ ํฌ๊ธฐ์ ๋ฐฐ์ด buff๋ฅผ ์ ์ธํ๊ณ , mergetSort()๋ฅผ ์คํ ํ ์ ๋ ฌ์ด ๋๋๋ฉด ๋ฐฐ์ด buff๋ฅผ ํด์
๋งค๊ฐ๋ณ์ : int[] a, int n
๋ฉ์๋ mergeSort() : ๋ฐฐ์ด a์ index left ๋ถํฐ right ๊น์ง ์์๋ฅผ ํฉ๋ณ ์ ๋ ฌ
๋งค๊ฐ๋ณ์ : int[] a, int left, int right
- ํฉ๋ณ ์ ๋ ฌ :
static int[] buff;
void mergeSort(int[] a, int n) {
buff = new int[n];
mergeSort(a, 0, n-1);
buff = null;
}
void mergeSort(int[] a, int left, int right) {
if(left < right) {
int i;
int center = (left + right) /2;
int p = 0;
int j = 0;
int k = left;
mergeSort(a, left, center);
mergeSort(a, center + 1, right);
for(i = left; i <= center; i++)
buff[p++] = a[i];
while(i <= right && j < p)
a[k++] = (buff[j] <= a[i]) ? buff[j++] : a[i++];
while(j < p)
a[k++] = buff[j++];
}
}
ํฉ๋ณ ์ ๋ ฌ Merge Sort :
์ต์ = O(NlogN), ํ๊ท = O(NlogN), ์ต์ = O(NlogN)
์์ ํ ์ ๋ ฌ