소개글
이번에 자료처리 과목을 들으면서 만들어본 3원 다단계 합병정렬 소스 입니다.컴파일 실행환경
비쥬얼 C++, 리눅스 레드햇 9.0, 유닉스 sun5.0에서 다 돌려 봐도 됩니다.실행을 시키면 별로 나타나는것은 없고 7개 파일이 만들어 집니다.
input.txt - 난수를 1000개 생성하여 저장
intermed.txt - 중간화일입니다. 런이 난수가 어떻게 생성되었는지, 런이 어떻게 분배 되었는지, 각 단계마다 런이 어떻게 합병 되었는지를 보여 줍니다.
intermed00~03 - 합병되는 파일들입니다.
output.txt - 최종 결과물을 저장합니다.
temp.txt - 파일을 다시 쓰기위해 잠시 담아 두는 임시 파일 입니다.
질문 필요하시면 kukuta@dreamwiz.com으로 메일 주세요
본문내용
int TripleMerge(char* dest, char* file0, char* file1, char* file2) {FILE *fpd, *temp, **fp; //fpd - 쓰기 파일, *temp - 임시 파일 포인터 **fp - 읽기 전용 파일 포인터들
char *filename[3]; //파일이름을 담기위한 변수
int runcount[DEGREE]; //각 파일의 런의 총 갯수를 담기 위한 변수
int totrunsz=0, runsz[DEGREE]; // totrunsz 같은 인덱스의 런이 담고 있는 총 레코드의 수
//runsz 각 런이 가지고 있는 레코드수
int buf[DEGREE];
int frozen[DEGREE]; //FindUnfrozenSmallestIndex함수를 쓰기 위한 변수
//선택 된것을 동결시켜 다시 선택 되지 못하도록 한다.
int i, j, k, index; //index 가장 적은 런의 갯수를 가지고 있는 파일 인덱스 건드리면 죽는다
filename[0]=file0; //파일 이름 할당
filename[1]=file1;
filename[2]=file2;
fp=(FILE**)malloc(sizeof(FILE*)*(DEGREE+1));
fpd=fopen(dest, "w"); //파일의 개방
fp[0]=fopen(filename[0], "r+");
fp[1]=fopen(filename[1], "r+");
fp[2]=fopen(filename[2], "r+");
memset(runcount, 0, sizeof(runcount));
memset(runsz, 0, sizeof(runsz));
memset(frozen, 0, sizeof(frozen));
for(i=0; i<DEGREE; i++) //읽기용 파일에서 파일이 하나라도
if(feof(fp[i])) //비었다면
return -1; //에러..
//한 파일안에 들어 있는 런의 총갯수를 읽는다.
for(i=0; i<DEGREE; i++) {
fscanf(fp[i], " %d", &runcount[i]);
}
index=FindSmallestIndex(runcount, DEGREE); //가장 작은 런 갯수를 가진 파일을 찾는다.
fprintf(fpd, " %d", runcount[index]); //쓰기 파일에 런의 갯수를 쓴다.
for(i=0; i<runcount[index]; i++) { //최소 런의 갯수 만큼 반복
for(j=0; j<DEGREE; j++) {
fscanf(fp[j], " %d", &runsz[j]); //런 하나의 레코드 갯수를 익는다.
totrunsz+=runsz[j];
fscanf(fp[j], " %d", &buf[j]); //최초 런의 최초 레코드 값을 읽는다.
runsz[j]--;
}
fprintf(fpd," %d", totrunsz); //런 앞에 최대 런수 쓰기
for(j=0; j<totrunsz; j++) {
k=FindUnfrozenSmallestIndex(buf, DEGREE, frozen); //가장 작은런 찾아서
fprintf(fpd, " %d", buf[k]); //파일에 쓰기
if(runsz[k]>0) { //런사이즈가 0 초과면
fscanf(fp[k], " %d", &buf[k]); //또 읽어 오기
runsz[k]--;
frozen[k]=0;
}
}
totrunsz=0;
memset(frozen, 0, sizeof(frozen));
memset(runsz, 0, sizeof(runsz));
} //최소 런 갯수 쓰기 파일에 쓰기 끝.
//빈파일 만들기 시작
for(i=0; i<DEGREE; i++) {
temp=fopen("temp.txt", "w+");
if(!feof(fp[i])) {
while(!feof(fp[i])) {
fscanf(fp[i]," %d", &buf[i]);
fprintf(temp," %d", buf[i]);
}
fclos<font color=aaaaff>..</font>
참고 자료
없음프로그램소스 연관자료
이 자료와 함께 구매한 자료
- 파일 합병 0페이지
- C를 사용한 다단계 합병 (Polyphase merge)의 구현 0페이지
- [계단식 합병 알고리즘] 계단식 합병정렬 (선택정렬 사용) 10페이지
- [화일처리론] 파일처리론 연습문제 (1장~14장) 12페이지
- 파일처리 - 다단계 합병 0페이지