728x90
๊ธฐ์์ ๋ ฌ์ด๋
- ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ์์(Radix)๋ฅผ ์ด์ฉํ์ฌ ์ ๋ ฌํ๋ ๋ฐฉ์
- ๋ฐ์ดํฐ์ ๊ฐ ์๋ฆฟ์๋ผ๋ฆฌ ๋น๊ตํ๋ฉด์ ์ ๋ ฌ์ ์ํํ๋ค.
- ๊ฐ์ฅ ์์ ์๋ฆฟ์๋ถํฐ ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ธ
LSD(Least-Significant-Digit)์ ๊ฐ์ฅ ํฐ ์๋ฆฟ์๋ถํฐ ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ธMSD(Most-Significant-Digit)๊ฐ ์๋ค.
๊ธฐ์์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ณผ์
ํ์๋ฆฌ์ ์ผ๋ ๋ฐ์ดํฐ์ ๊ฐ์ด ์ธ๋ฑ์ค๊ฐ ๋์ด ๋ฐฐ์ด์ ์ ๋ ฌ๋๋ค.
๋ง์ฝ 2์๋ฆฌ ์ผ๋? (28,93,39,81,62,72,38,26)
๋ฎ์ ์๋ฆฌ์๋ก ๋จผ์ ๋ถ๋ฅํ ๋ค์, ์์๋๋ก ์ฝ์ด์ ๋ค์ ๋์ ์๋ฆฌ์๋ก ๋ถ๋ฅํ๋ค.
- ๋ฒ์ผ์ ํ๋ก ๊ตฌํ
- ๋ฒ์ผ์ ๊ฐ์๋ ํค์ ํํ ๋ฐฉ๋ฒ๊ณผ ๋ฐ์ ํ ๊ด๊ณ๊ฐ ์๋ค.(์ด์ง๋ฒ2๊ฐ, ์ํ๋ฒณ26๊ฐ, ์ญ์ง๋ฒ10๊ฐ)
- ์๋ฆฌ์์ ๋ฐ๋ผ ํ์ ์์ฐจ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ค.
- ๋ฒ์ผ์์๋ถํฐ ์์ฐจ์ ์ผ๋ก dequeueํ์ฌ ํ๋์ ๋ฆฌ์คํธ๋ก ํฉ์น๋ค.
- ๋ฒ์ผ ์๋งํผ ๋ฐ๋ณต
#include <stdio.h>
#include <time.h>
#define BUCKETS 10
#define DIGITS 4
#define SIZE 10
//ํ์ฝ๋์๋ต
void radix_sort(int list[], int n)
{
int i, b, d, factor=1;
QueueType queues[BUCKETS];
for(b=0;b<BUCKETS;b++) init(&queues[b]); // ํ๋ค์ ์ด๊ธฐํ
for(d=0; d<DIGITS; d++){
for(i=0;i<n;i++) // ๋ฐ์ดํฐ๋ค์ ์๋ฆฌ์์ ๋ฐ๋ผ ํ์ ์
๋ ฅ
enqueue( &queues[(list[i]/factor)%10], list[i]);
for(b=i=0;b<BUCKETS;b++) // ๋ฒ์ผ์์ ๊บผ๋ด์ด list๋ก ํฉ์น๋ค.
while( !is_empty(&queues[b]) )
list[i++] = dequeue(&queues[b]);
factor *= 10; // ๊ทธ ๋ค์ ์๋ฆฌ์๋ก ๊ฐ๋ค.
}
}
int main(void)
{
int list[SIZE];
srand(time(NULL));
for (int i = 0; i<SIZE; i++) // ๋์ ์์ฑ ๋ฐ ์ถ๋ ฅ
list[i] = rand() % 100;
radix_sort(list, SIZE); // ๊ธฐ์์ ๋ ฌ ํธ์ถ
for (int i = 0; i<SIZE; i++)
printf("%d ", list[i]);
printf("\n");
return 0;
}
๊ธฐ์์ ๋ ฌ ์๊ฐ๋ณต์ก๋
- n๊ฐ์ ๋ ์ฝ๋, d๊ฐ์ ์๋ฆฟ์๋ก ์ด๋ฃจ์ด์ง ํค๋ฅผ ๊ธฐ์ ์ ๋ ฌํ ๊ฒฝ์ฐ,
O(dn)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. - ํ์ง๋ง ์ค์, ํ๊ธ, ํ์๋ก ์ด๋ฃจ์ด์ง ํค๋ ์ ๋ ฌํ์ง ๋ชปํ๋ค๋ ๋จ์ ์ด ์๋ค.
728x90