/*
자료구조 - 2번째 과제물.
제출 기한 : 2006. 3. 31. Friday 6:00 PM.
주어진 숫자를 radix sort algorithm (pp. 350-357) 을 이용하여 정렬하라.
예 (radix 가 10일 경우):
329 720 720 329
457 355 329 355
657 436 436 436
839 -> 457 -> 839 -> 457
436 657 355 657
720 329 457 720
355 839 657 839
Input 양식:
5 // input 개수
10329353
2340213
234091223
2342321
2341323
Output 양식:
2340213
2341323
2342321
10329353
234091223
조건:
1. 각 숫자는 최대 9자리이다.
2. Input은 C:ass2_input.txt에서 입력 받아서 C:ass2_output.txt에 출력하면 된다.
3. 제출시 파일명은 "학번_이름_반"으로 작성하세요. 여기서 반은 과제물 제출 게시판의 반입니다.(A,B,C)
예) 200621094_홍길동_A.exe /200621094_홍길동_A.c
4. 소스 파일과 실행 파일모두 제출 하셔야 합니다.
5. input 개수에 상관없이 작동해야 합니다. 단 integer범위를 벗어나진 않습니다.
6. c: 폴더에 실행파일이 없을 경우에도 동작해야 합니다.
7. Radix_Size에 변동 사항이 있을 경우 공지사항에 다시 올리겠습니다.
8. 공지 사항을 꼭 확인해 주세요.
*/
#include <stdlib.h> // to use function: atoi()
#include <string.h> // to reset buffer: memset()
#include <windows.h> // for class CTimeCouter
#include <stdio.h> // for class CTimeCouter
#define IN_FILE "c:\\ass2_input.txt"
#define OUT_FILE "c:\\ass2_output.txt"
// global variables here
struct data{
int* list; // input data enters here
int* temp; // mydata.temporary data to exchange
int num_in; // number of inputs
}mydata;
struct time{
LARGE_INTEGER st, ed, freq ;
double gap ;
BOOL bEnable;
char szName[256];
UINT counter;
double fTotal_Time;
}mytime;
static void Start()
{
mytime.gap = 0.0; // init
mytime.bEnable = FALSE;
mytime.counter = 0;
mytime.fTotal_Time = 0.0;
// system test
QueryPerformanceCounter ( &mytime.st ) ;
if ( mytime.st.QuadPart == 0 )
{
mytime.bEnable= FALSE;
OutputDebugString("시스템이 지원이 안됨,,, 사용할 수 없음[CTimeCounter Class]\n");
}
// start()
mytime.counter ++;
QueryPerformanceCounter ( &mytime.st ) ;
}
static void End()
{
char szMsg[64];
QueryPerformanceCounter ( &mytime.ed ) ;
QueryPerformanceFrequency ( &mytime.freq ) ;
// 소요 시간 계산
mytime.gap = ( (double) (mytime.ed.QuadPart - mytime.st.QuadPart )) / ( (double) mytime.freq.QuadPart ) ;
mytime.fTotal_Time += mytime.gap;
sprintf ( szMsg, "수행시간 %.6f초\n", mytime.gap) ;
OutputDebugString(szMsg);
}
int read(FILE * in_file)
{
char tmpr[10]="";
int i;
fscanf(in_file,"%s",&tmpr);
if (atoi(tmpr)==0) return 0; // break if input is zero
else
{
mydata.num_in=atoi(tmpr)+1;
mydata.list = (int*)malloc(sizeof(int)*mydata.num_in); // memory allocation as size of mydata.num_in, and link this to mydata.list
mydata.temp = (int*)malloc(sizeof(int)*mydata.num_in); // memory allocation as size of mydata.num_in, and link this to mydata.temp
for(i=1; i<mydata.num_in; i++)
{
fscanf(in_file,"%s",&tmpr);
mydata.list[i] = atoi(tmpr);
}
}
return 1;
}
static void sort(FILE* out_file)
{
int cnt[256], idx[256], i;
Start(); // start stopwatch
memset(cnt, 0, 1024); // initializing count
idx[0]=0; // initializing index
for(i=0; i<mydata.num_in; i++) cnt[(mydata.list[i] >> 0) & 255]++;
for(i=1; i<256; i++) idx[i] = idx[i-1] + cnt[i-1];
for(i=0; i<mydata.num_in; i++) mydata.temp[idx[(mydata.list[i] >> 0) & 255]++] = mydata.list[i];
memset(cnt, 0, 1024); // initializing count
idx[0]=0; // initializing index
for(i=0; i<mydata.num_in; i++) cnt[(mydata.temp[i] >> 8) & (255)]++;
for(i=1; i<256; i++) idx[i] = idx[i-1] + cnt[i-1];
for(i=0; i<mydata.num_in; i++) mydata.list[idx[(mydata.temp[i] >> 8) & 255]++] = mydata.temp[i];
memset(cnt, 0, 1024); // initializing count
idx[0]=0; // initializing index
for(i=0; i<mydata.num_in; i++) cnt[(mydata.list[i] >> 16) & (255)]++;
for(i=1; i<256; i++) idx[i] = idx[i-1] + cnt[i-1];
for(i=0; i<mydata.num_in; i++) mydata.temp[idx[(mydata.list[i] >> 16) & 255]++] = mydata.list[i];
memset(cnt, 0, 1024); // initializing count
idx[0]=0; // initializing index
for(i=0; i<mydata.num_in; i++) cnt[(mydata.temp[i] >> 24) & (255)]++;
for(i=1; i<256; i++) idx[i] = idx[i-1] + cnt[i-1];
for(i=0; i<mydata.num_in; i++) mydata.list[idx[(mydata.temp[i] >> 24) & 255]++] = mydata.temp[i];
End(); // stop stopwatch
fprintf(out_file,"%.10f\n", mytime.fTotal_Time);
for(i=0; i<mydata.num_in-1;i++) fprintf(out_file,"%d ", mydata.list[i]);
fprintf(out_file,"\n");
}
void main(void)
{
FILE *in_file, *out_file;
in_file=fopen(IN_FILE,"r");
out_file=fopen(OUT_FILE,"w");
while(read(in_file)) sort(out_file);
fclose(in_file);
fclose(out_file);
free(mydata.list);
free(mydata.temp);
}
'geek_stuff > today' 카테고리의 다른 글
Tistory.com Beta에서의 첫 글 (3) | 2006.05.26 |
---|---|
1kko.com 블로그의 변천사 (0) | 2006.05.21 |
자료구조 과제 #1 (0) | 2006.05.10 |
심심해서 서버 하나를 뚫어봤다. (0) | 2006.05.08 |
Apple.com이 윈도우즈를 지원한다?! (2) | 2006.04.06 |