1. ๊ธฐ๋ณธ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ์๊ฐ ๋ณต์ก๋ O(n^2)
1) ์ ํ ์ ๋ ฌ
๋ฐฐ์ด ์์์ ๊ฐ์ฅ ํฐ ์์๋ฅผ ์ฐพ์ ๋ฐฐ์ด์ ๋งจ ๋ ์๋ฆฌ์ ๋ฐ๊พธ๋ ๋ฐฉ์์ด๋ค.
for (int i = 0; i < MaxSize - 1; i++) {
Least = i;
for (int j = i + 1; j < MaxSize - 1; j++)
if (Array[j] < Array[Least])
Least = j;
if (i != Least) {
int Temp = Array[i];
Array[i] = Array[Least];
Array[Least] = Temp;
}
}
2) ๋ฒ๋ธ ์ ๋ ฌ
์ผ์ชฝ๋ถํฐ ์ด์ํ ์๋ฅผ ๋น๊ตํ๋ฉฐ ์์๊ฐ ์ ๋๋ก ๋์ด ์์ง ์์ผ๋ฉด ์๋ก ๋ฐ๊พธ๋ ๋ฐฉ์์ด๋ค.
for (int i = MaxSize - 1; i > 0; i--)
for (int j = 0; j < i; j++)
if (Array[j] > Array[j + 1]) {
int Temp = Array[j];
Array[j] = Array[j + 1];
Array[j + 1] = Temp;
}
3) ์ฝ์ ์ ๋ ฌ
๋ ๋ฒ์งธ ์ซ์๋ถํฐ ์ฐจ๋ก๋๋ก ์์ ์ซ์๋ค๊ณผ ๋น๊ตํ๋ฉฐ ์๊ธฐ ์๋ฆฌ๋ฅผ ์ฐพ๋ ๋ฐฉ์์ด๋ค.
for (int i = 1; i < MaxSize; i++) {
int Target = Array[i];
for (int j = i - 1; j >= 0 && Array[j] > Target; j--)
Array[j + 1] = Array[j];
Array[j + 1] = Target;
}
2. ๊ณ ๊ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ์๊ฐ ๋ณต์ก๋ O(nlogn)
1) ๋ณํฉ ์ ๋ ฌ
๋ฐ์ผ๋ก ๋๋ ๋ค ์ ๋ฐ๋ถ์ ํ๋ฐ๋ถ๋ฅผ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ ๋ ฌํ๊ณ ์ ๋ ฌ๋ ๋ ๋ถ๋ถ์ ๋ค์ ํฉ์น๋ค. ์ฌ๊ธฐ์ ๋๋ ์ ๋ฐ๋ถ์ ํ๋ฐ๋ถ๋ฅผ ์ ๋ ฌํ ๋๋ ์ฌ๊ท์ ์ผ๋ก ๋๋ ์ ์ ๋ ฌํ๋ค.
- ์์ฐจ์ ์ธ ๋น๊ต๋ก ์ ๋ ฌ์ ์งํํ๋ฏ๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ ๋ ฌ ์ ์ฌ์ฉํ๋ฉด ํจ์จ์ ์ด๋ค.
void MergeSort(int* Array, int start, int end)
{
if (start >= end)
return;
int mid = (start + end) / 2;
MergeSort(Array, start, mid);
MergeSort(Array, mid + 1, end);
int tmp[1000] = {};
int i = start, j = mid + 1, k = start;
while (i <= mid && j <= end) {
if (Array[i] < Array[j])
tmp[k++] = Array[i++];
else
tmp[k++] = Array[j++];
}
while (i <= mid)
tmp[k++] = Array[i++];
while (j <= end)
tmp[k++] = Array[j++];
for (i = start; i <= end; ++i)
Array[i] = tmp[i];
}
2) ํต ์ ๋ ฌ
๊ธฐ์ค ์์(Pivot)๋ฅผ ์ผ์ ์์ ์๋ ์ผ์ชฝ, ํฐ ์๋ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฌ๋ฐฐ์นํ๋ค. ์ฌ๋ฐฐ์น๊ฐ ๋๋๋ฉด ๋ ๊ธฐ์ค ์์๋ฅผ ์ผ์ ์ฌ๊ท์ ๋ฐ๋ณตํ์ฌ ์ ๋ ฌํ๋ค.
- C++์ Sort ๋ด ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
void QuickSort(int* Array, int Left, int Right)
{
int Pivot = Left;
int LeftPivot = Left;
int RightPivot = Right;
while (LeftPivot < RightPivot)
{
while (Array[LeftPivot] <= Array[Pivot] && LeftPivot < Right)
LeftPivot++;
while (Array[RightPivot] >= Array[Pivot] && RightPivot > Left)
RightPivot--;
if (LeftPivot < RightPivot) {
swap(Array[LeftPivot], Array[RightPivot]);
continue;
}
swap(Array[Pivot], Array[RightPivot]);
QuickSort(Array, Left, RightPivot - 1);
QuickSort(Array, RightPivot + 1, Right);
}
}
3) ํ ์ ๋ ฌ
๋ฐฐ์ด์ ํ์ผ๋ก ๋ง๋ค๊ณ ๋ฃจํ ๋ ธ๋๋ถํฐ ํ๋์ฉ ํ์์ ์ ๊ฑฐํจ์ผ๋ก์จ ์ ๋ ฌํ๋ค.
- ๊ฐ์ฅ ํฌ๊ฑฐ๋ ๊ฐ์ฅ ์์ ๊ฐ์ ๊ตฌํ ๋ ์ ์ฉํ๋ค.
3. ํน์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ์๊ฐ ๋ณต์ก๋ O(n)
1) ๊ณ์(Counting) ์ ๋ ฌ
ํญ๋ชฉ๋ค์ ์์๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์งํฉ์ ๊ฐ ํญ๋ชฉ์ด ๋ช ๊ฐ์ฉ ์๋์ง ์ธ๋ ์์ ์ด๋ค.
- ์ ์๋ก ํํํ๋ ์๋ฃํ์ ๋ํด์๋ง ์ ์ฉํ๋ค.
- ์งํฉ ๋ด ๊ฐ์ฅ ํฐ ์ ์๋ฅผ ์์์ผ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
// N๊ฐ์ ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ด๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
// ์ฒซ์งธ ์ค์ ์์ ๊ฐ์ N(1 ≤ N ≤ 10,000,000)์ด ์ฃผ์ด์ง๋ค.
// ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ซ์๊ฐ ์ฃผ์ด์ง๊ณ 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
int arr[10001] = {};
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
arr[num]++;
}
for (int i = 1; i <= 10000; i++)
while (arr[i]-- != 0)
printf("%d\n", i);
2) ๊ธฐ์(Radix) ์ ๋ ฌ
๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ์์(Radix)๋ฅผ ์ด์ฉํ์ฌ ์ ๋ ฌ์ ์งํํ๋ ๋ฐฉ์์ด๋ค.
4. Stable Sort(์์ ์ฑ ์๋ ์ ๋ ฌ)
๊ฐ์ ๊ฐ์ ๊ฐ์ง ๋ฐ์ดํฐ์ ์์๊ฐ ์ ๋ ฌ ํ์๋ ๋ฐ๋์ง ์๋ ์ ๋ ฌ๋ก ๋ฒ๋ธ ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ, ๋ณํฉ ์ ๋ ฌ, ๊ธฐ์ ์ ๋ ฌ, ๊ณ์ ์ ๋ ฌ์ด ์๋ค.
5. ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ ํ
- ์๊ฐ ๋ณต์ก๋์ ๋ฐ๋ผ ์ ํ
- ๊ณต๊ฐ ๋ณต์ก๋์ ๋ฐ๋ผ ์ ํ: ๋ณํฉ ์ ๋ ฌ ๊ฐ์ ๊ฒฝ์ฐ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํด์ผ ํ๋ค.
- Stable์ ๋ฐ๋ผ ์ ํ