๐ก ์ด๋ฒ์๋ ๊ธฐ์ ์ ๋ ฌ ํ๋ ๋ฒ์ ๋ฐฐ์๋ณด์๋ค.
๋ฌธ์
๐ก ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ด ์ค๋ฆ์ฐจ์์ผ๋ก ๊ธฐ์ ์ ๋ ฌ ๋๊ฒ ์ฝ๋๋ฅผ ๊ตฌํํ์์ค
๋น์ฐํ ์๋ ๋ฌธ์ ๊ธฐ์ ๋์ถฉ ๋ด๊ฐ ๋ง๋ค์๋ค.
ํด๋ต
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAX 10000
void radixSort(int *a, int n) {
int res[MAX]; // ๊ฒฐ๊ณผ ๋ฐฐ์ด
int maxValue = 0;
int exp = 1;
for (int i = 0 ; i < n ; i++) {
if (a[i] > maxValue) {
maxValue = a[i];
}
}
while (maxValue / exp > 0) {
int bucket[10] = { 0 };
for (int i = 0 ; i < n ; i++) {
bucket[a[i] / exp % 10]++;
}
for (int i = 1 ; i < 10 ; i++) {
bucket[i] += bucket[i - 1];
}
for (int i = n - 1 ; i >= 0 ; i--) {
res[--bucket[a[i] / exp % 10]] = a[i];
}
for (int i = 0 ; i < n; i++) {
a[i] = res[i];
}
exp *=10;
}
}
int main(void) {
int a[MAX];
int i, n;
scanf("%d", &n);
for (i = 0 ; i < n ; i++) {
scanf("%d", &a[i]);
}
radixSort(a, n);
for(i = 0 ; i < n ; i++) {
printf("%d ", a[i]);
}
return 0;
}
์ค๋ช
๊ธฐ์ ์ ๋ ฌ์ด๋?
Radix Sort๋ผ๊ณ ํ๋ ๊ธฐ์ ์ ๋ ฌ์ด๋ ์๋ฆฟ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐจ๋ก๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋ฆฟ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฅํ๋ฏ๋ก ๊ฐ์ฅ ํฐ ์๋ฆฟ์๋ฅผ D๋ผ๊ณ ํ์ ๋ ๐(๐ท๐)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
์์ ์์๊ฐ ์์ ๋ ๋จผ์ 1์ ์๋ฆฌ๋ถํฐ ์ฒดํฌํ๋ค.
์์78425341653034
๊ธฐ์ ์ ๋ ฌ์ ์๋ฆฟ์ ๋ฐฐ์ด์ ๋์ ์ผ๋ก ์์ด๋ฏ๋ก ๊ณ์ ์ ๋ ฌ๊ณผ ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์ ์ดํดํด์ผ ํ๋ค.
์๋ฆฟ์ ๋ฐฐ์ด0123456789
(๋์ ) | 1 = 1 | 1+1 = 2 | 0 | 0 | 1+1+2 = 4 | 1+1+2+2 = 6 | 0 | 1+1+2+2+1 = 7 | 0 | 0 |
์์ ๋ฐ๋ผ์ ์์๋ฅผ ๋ค์์๋ถํฐ ์ ๋ ฌ ํด์ค๋ค.
๊ฒฐ๊ณผ๊ฐ30341843425657
1์ ์๋ฆฌ๋ฅผ ์ ๋ ฌํ ํ 10์ ์๋ฆฌ๋ฅผ ์ฒดํฌํ๋ค.
์์30341843425657
์๋ฆฟ์ ๋ฐฐ์ด0123456789
(๋์ ) | 1 = 1 | 0 | 1+1 = 2 | 1+1+2 = 4 | 1+1+2+1 = 5 | 0 | 1+1+2+1+1 = 6 | 0 | 1+1+2+1+1+1 = 7 | 0 |
์์ ๋ฐ๋ผ์ ์์๋ฅผ ๋ค์์๋ถํฐ ์ ๋ ฌํด์ค๋ค.
๊ฒฐ๊ณผ๊ฐ72530343416584
10์ ์๋ฆฌ๋ฅผ ์ ๋ ฌํ ํ 100์ ์๋ฆฌ๋ฅผ ์ฒดํฌํ๋ค.
์์72530343416584
์๋ฆฟ์ ๋ฐฐ์ด0123456789
(๋์ ) | 6 | 0 | 0 | 6+1 = 7 | 0 | 0 | 0 | 0 | 0 | 0 |
์์ ๋ฐ๋ผ์ ์์๋ฅผ ๋ค์์๋ถํฐ ์ ๋ ฌํด์ค๋ค.
๊ฒฐ๊ณผ๊ฐ72530346584341
radixSort ํจ์
void radixSort(int *a, int n) {
int res[MAX]; // ๊ฒฐ๊ณผ ๋ฐฐ์ด
int maxValue = 0;
int exp = 1; // 1์ ์๋ฆฌ
for (int i = 0 ; i < n ; i++) { // n์ main์์ ๋ฐ์ ์์ ๊ฐ์์ด๋ค.
// a[i]๊ฐ maxValue๋ณด๋ค ํฌ๋ค๋ฉด a[i] ๊ฐ์ด maxValue๊ฐ ๋๋ค.
if (a[i] > maxValue) {
maxValue = a[i];
}
}
while (maxValue / exp > 0) { // 1์ ์๋ฆฌ๋ถํฐ ๊ณ์ฐํ๋ค.
int bucket[10] = { 0 }; // ์๋ฆฟ์
for (int i = 0 ; i < n ; i++) { // ์๋ฆฟ์ ๋ฐฐ์ด ์ฒ๋ฆฌ(๊ณ์ ์ ๋ ฌ๊ณผ ๋์ผํ๋ค.)
bucket[a[i] / exp % 10]++;
}
for (int i = 1 ; i < 10 ; i++) { // ๋์ ๊ณ์ฐ
// ์ธ๋ฑ์ค 0๋ฒ์ ๋์ ๊ณ์ฐ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ int i = 1; ๋ถํฐ ์์ํ์๋ค.
// ๋ํ bucket[i - 1]๋ ๋์ผํ ์ด์ ๋๋ฌธ์ด๋ค.
bucket[i] += bucket[i - 1];
}
// n์ main์์ ๋ฐ์์จ ์์ ๊ฐ์๋ก ์ธ๋ฑ์ค ๊ฐ์ ๊ณ ๋ คํ์ง ์์๊ธฐ ๋๋ฌธ์ n - 1 ๋ถํฐ ์์ํ๋ค.
for (int i = n - 1 ; i >= 0 ; i--) {
// ์๋ฆฟ์ ๋ฐฐ์ด ์ฒ๋ฆฌ์์ ์ ๋ ฌ๋ ์๋ฆฌ ์ธ๋ฑ์ค์ ์์๋ - ์ฒ๋ฆฌ ํด์ค๋ค.
res[--bucket[a[i] / exp % 10]] = a[i];
}
for (int i = 0 ; i < n; i++) { // ๊ธฐ๋ณธ ๋ฐฐ์ด ๊ฐฑ์
a[i] = res[i];
}
exp *=10; // 10์ด ๊ณฑํด์ง๊ธฐ ๋๋ฌธ์ while๋ฌธ์ ๋๋๋ง๋ค ๋ค์ ์๋ฆฟ์๋ฅผ ๊ณ์ฐํ๊ฒ ๋๋ค.
}
}
๊ณ์ ์ ๋ ฌ์์ ์ฌ์ฉ ํ ๋งํ ์ฝ๋์ ๊ธฐ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์์๋ง ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ์์ฌ์์ด ์ฝ๋ ์ฃผ์์ด ์กฐ๊ธ ๋ณต์กํ๋ค.
๋๋ ์ดํดํ๋ ๋ฐ์ ์ค๋๊ฑธ๋ ธ๊ณ , ํนํ res[--bucket[a[i] / exp % 10]] = a[i]; ์ด๋ฐ ์ฝ๋๋ ํ๋ฒ์ ์ดํดํ๊ธฐ๊ฐ ์ด๋ ค์์ ๋ง์ด ์๊ฐํด๋ณด๋ ๊ฒ ๊ฐ๋ค.
๋ง์น๋ฉฐ..
๋๋ ํฌ์คํ ์ ํ๋ ์ ์ฅ์ด๋ ์ต๋ํ ์ดํดํ๊ณ ๊ธ์ ์ฐ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
๊ทธ๋์ ์๊ฐ์ด ๋ ์ค๋๊ฑธ๋ฆฌ๋ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค.
๊ทธ๋ฌ๋ฉด์ ๋ฐฐ์ฐ๋ ๊ฒ์ด ์์ฒญ๋๊ฒ ํฌ๊ธฐ ๋๋ฌธ์ ํ๋ค์ด๋ ์ด ํฌ์คํ ์ ๊ณ์ ์ด์ด๋๊ฐ ์์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํน์๋ ๋ด ๋ธ๋ก๊ทธ์ ๋ค์ด์์ ๋์์ ๋ฐ๋ ์ด๊ฐ ์๋ค๋ฉด.. ๋๋ฌด ๊ธฐ๋ถ ์ข์ ๊ฒ ๊ฐ๋ค.