๋ณํฉ ์ ๋ ฌ์ ๋ง๊ทธ๋๋ก “๋ถํ ”ํ์ฌ “์ ๋ณต” ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- 1๋จ๊ณ (๋ถํ ) ํด๊ฒฐ์ด ์ฉ์ดํ ๋จ๊ณ๊น์ง ๋ถํ ํด ๋๊ฐ๋ค.
- 2๋จ๊ณ (์ ๋ณต) ํด๊ฒฐ์ด ์ฉ์ดํ ์์ค๊น์ง ๋ถํ ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
- 3๋จ๊ณ (๊ฒฐํฉ) ๋ถํ ํด์ ํด๊ฒฐํ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํฉํ์ฌ ๋ง๋ฌด๋ฆฌํ๋ค.
์๋ฅผ๋ค์ด 8๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ ๋ ฌํ๋ ๊ฒ ๋ณด๋ค, ์ด๋ฅผ ๋๋ก๋๋ 4๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ์ด ์ฝ๊ณ , ๋ ์ด๋ค ๊ฐ๊ฐ์ ๋ค์ ํ๋ฒ ๋๋ก ๋๋ ์ 2๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ์ด ๋ ์ฝ๋ค.
https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html
code
#include <stdio.h>
#include <stdlib.h>
void MergeTwoArea(int arr[], int left, int mid, int right)
{
int fIdx = left;
int rIdx = mid + 1;
int sIdx = left;
int *sortArr = (int *)malloc(sizeof(right) + 1);
while (fIdx <= mid && rIdx <= right) // ์ด ๋ถ๋ถ์ ์ดํด ํด์ผํ๋ค.
{
if (arr[fIdx] < arr[rIdx])
sortArr[sIdx] = arr[fIdx++];
else
sortArr[sIdx] = arr[rIdx++];
sIdx++;
}
if (fIdx > mid)
{
for (int i = rIdx; i <= right; i++, sIdx++)
{
sortArr[sIdx] = arr[i];
}
}
else
{
for (int i = fIdx; i <= mid; i++, sIdx++)
{
sortArr[sIdx] = arr[i];
}
}
for (int i = left; i <= right; i++)
{
arr[i] = sortArr[i];
}
free(sortArr);
}
void MergeSort(int arr[], int left, int right)
{
int mid;
if (left < right)
{
mid = (left + right) / 2;
MergeSort(arr, left, mid);
MergeSort(arr, mid + 1, right);
MergeTwoArea(arr, left, mid ,right);
}
}
int main(void)
{
int arr[8] = {21, 10, 12, 20, 25, 13, 15, 22};
int i;
MergeSort(arr, 0, sizeof(arr) / sizeof(int));
for (int i = 0; i < 8; i++)
printf("%d ", arr[i]);
return 0;
}
ํ๋์ ํ๋ ๊ฐ ๋ชจ์ฌ 2๊ฐ ๊ฐ ๋ ๋, ๋น๊ต์ฐ์ฐ์ 2ํ ์งํ๋๋ค.
while (fIdx <= mid && rIdx <= right) { if (arr[fIdx] < arr[rIdx]) sortArr[sIdx] = arr[fIdx++]; else sortArr[sIdx] = arr[rIdx++]; sIdx++; } if (fIdx > mid) { for (int i = rIdx; i <= right; i++, sIdx++) { sortArr[sIdx] = arr[i]; } } else { for (int i = fIdx; i <= mid; i++, sIdx++) { sortArr[sIdx] = arr[i]; } } for (int i = left; i <= right; i++) { arr[i] = sortArr[i]; }
while๋ฌธ์ ์ง๋ ๋, if~else๋ฌธ์ ์ง๋ ๋.
์์ ๊ทธ๋ฆผ์์ ๋ณํฉ 1์ ์ง๋ ๋์ ๋น๊ต์ฐ์ฐ์ ์๋ 8ํ์ด๋ค.
๋๊ฐ์ ๋๊ฐ๊ฐ ๋ชจ์ฌ 4๊ฐ๊ฐ ๋ ๋?. ๋น๊ต์ฐ์ฐ์ ์๋ 8ํ์ด๋ค.
์ด๋ ๋ฏ ๋ง์ง๋ง ํ๋์ ๋ฐ์ดํฐ๊ฐ ๋จ์ ๋ ๊น์ง ๋น๊ต์ฐ์ฐ์ด ์งํ๋๋ ๊ฒฝ์ฐ์ ๋น๊ต์ฐ์ฐ์ ํ์๋ ์ด 8ํ์ด๋ค.
“์ ๋ ฌ์ ๋์์ธ ๋ฐ์ดํฐ์ ์๊ฐ n๊ฐ ์ผ๋, ๋ณํฉ ์ ๋ ฌ์์ ์งํ๋๋ ์ต๋ ์ฐ์ฐ์ ์๋ ์ต๋ n๋ฒ์ด๋ค.
๋ฐ๋ผ์ ๋ณํฉ ์ ๋ ฌ์ ๋น๊ต์ฐ์ฐ์ ๋ํ ๋น -์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
O(n log2n)
๋ณํฉ ์ ๋ ฌ
๋ณํฉ ์ ๋ ฌ
๋ณํฉ ์ ๋ ฌ์ ๋ง๊ทธ๋๋ก “๋ถํ ”ํ์ฌ “์ ๋ณต” ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- 1๋จ๊ณ (๋ถํ ) ํด๊ฒฐ์ด ์ฉ์ดํ ๋จ๊ณ๊น์ง ๋ถํ ํด ๋๊ฐ๋ค.
- 2๋จ๊ณ (์ ๋ณต) ํด๊ฒฐ์ด ์ฉ์ดํ ์์ค๊น์ง ๋ถํ ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
- 3๋จ๊ณ (๊ฒฐํฉ) ๋ถํ ํด์ ํด๊ฒฐํ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํฉํ์ฌ ๋ง๋ฌด๋ฆฌํ๋ค.
์๋ฅผ๋ค์ด 8๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ ๋ ฌํ๋ ๊ฒ ๋ณด๋ค, ์ด๋ฅผ ๋๋ก๋๋ 4๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ์ด ์ฝ๊ณ , ๋ ์ด๋ค ๊ฐ๊ฐ์ ๋ค์ ํ๋ฒ ๋๋ก ๋๋ ์ 2๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ์ด ๋ ์ฝ๋ค.
https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html
code
#include <stdio.h>
#include <stdlib.h>
void MergeTwoArea(int arr[], int left, int mid, int right)
{
int fIdx = left;
int rIdx = mid + 1;
int sIdx = left;
int *sortArr = (int *)malloc(sizeof(right) + 1);
while (fIdx <= mid && rIdx <= right) // ์ด ๋ถ๋ถ์ ์ดํด ํด์ผํ๋ค.
{
if (arr[fIdx] < arr[rIdx])
sortArr[sIdx] = arr[fIdx++];
else
sortArr[sIdx] = arr[rIdx++];
sIdx++;
}
if (fIdx > mid)
{
for (int i = rIdx; i <= right; i++, sIdx++)
{
sortArr[sIdx] = arr[i];
}
}
else
{
for (int i = fIdx; i <= mid; i++, sIdx++)
{
sortArr[sIdx] = arr[i];
}
}
for (int i = left; i <= right; i++)
{
arr[i] = sortArr[i];
}
free(sortArr);
}
void MergeSort(int arr[], int left, int right)
{
int mid;
if (left < right)
{
mid = (left + right) / 2;
MergeSort(arr, left, mid);
MergeSort(arr, mid + 1, right);
MergeTwoArea(arr, left, mid ,right);
}
}
int main(void)
{
int arr[8] = {21, 10, 12, 20, 25, 13, 15, 22};
int i;
MergeSort(arr, 0, sizeof(arr) / sizeof(int));
for (int i = 0; i < 8; i++)
printf("%d ", arr[i]);
return 0;
}
ํ๋์ ํ๋ ๊ฐ ๋ชจ์ฌ 2๊ฐ ๊ฐ ๋ ๋, ๋น๊ต์ฐ์ฐ์ 2ํ ์งํ๋๋ค.
while๋ฌธ์ ์ง๋ ๋, if~else๋ฌธ์ ์ง๋ ๋.
์์ ๊ทธ๋ฆผ์์ ๋ณํฉ 1์ ์ง๋ ๋์ ๋น๊ต์ฐ์ฐ์ ์๋ 8ํ์ด๋ค.
๋๊ฐ์ ๋๊ฐ๊ฐ ๋ชจ์ฌ 4๊ฐ๊ฐ ๋ ๋?. ๋น๊ต์ฐ์ฐ์ ์๋ 8ํ์ด๋ค.
์ด๋ ๋ฏ ๋ง์ง๋ง ํ๋์ ๋ฐ์ดํฐ๊ฐ ๋จ์ ๋ ๊น์ง ๋น๊ต์ฐ์ฐ์ด ์งํ๋๋ ๊ฒฝ์ฐ์ ๋น๊ต์ฐ์ฐ์ ํ์๋ ์ด 8ํ์ด๋ค.
“์ ๋ ฌ์ ๋์์ธ ๋ฐ์ดํฐ์ ์๊ฐ n๊ฐ ์ผ๋, ๋ณํฉ ์ ๋ ฌ์์ ์งํ๋๋ ์ต๋ ์ฐ์ฐ์ ์๋ ์ต๋ n๋ฒ์ด๋ค.
๋ฐ๋ผ์ ๋ณํฉ ์ ๋ ฌ์ ๋น๊ต์ฐ์ฐ์ ๋ํ ๋น -์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
O(n log2n)
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํต ์ ๋ ฌ (0) | 2023.02.28 |
---|