#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define BFRSIZE 4
#define RCDSIZE (sizeof(int))
struct fileInfo {
FILE* fp;
char fname[100];
int min;
int is_eof;
};
void bubbleSort(int *buf, int len);
void ToSWAP(int* a, int* b) {
int t = a;
a = b;
b = t;
}
void bubbleSort(int* buf, int len) {
int i, j;
for (i = len - 1; i > 0; i--)
for (j = 0; j < i; j++)
if (buf[j] > buf[j + 1])
ToSWAP(buf[j], buf[j + 1]);
}
void shellSort(int data[], int size) {
int i, j, gap, ist;
for (gap = size / 2; gap > 0; gap /= 2) {
for (i = gap; i < size; i++) {
ist = data[i];
j = i - gap;
while (j >= 0 && ist < data[j])
{
data[j + gap] = data[j];
j -= gap;
}
data[j + gap] = ist;
}
}
}
void quickSort2(int* data, int start, int end)
{
if (start >= end) return;
int pivot, front, last, tmp;
pivot = start;
front = start + 1;
last = end;
while (front <= last)
{
while (data[front] <= data[pivot] && front <= end) front++;
while (data[last] > data[pivot] && last >= start) last--;
if (front > last) break;
else {
ToSWAP(data[front], data[last]);
}
}
ToSWAP(data[last], data[pivot]);
quickSort2(data, start, last - 1);
quickSort2(data, last + 1, end);
}
void printArray(const int data[], int size) {
printf_s("[ ");
for (int i = 0; i < size - 1; i++) {
printf_s("%d, ", data[i]);
}
printf_s("%d ]\n\n", data[size - 1]);
}
int main(void)
{
int i, f;
FILE* srcFile, * dstFile;
int dataArr[] = { 80,50,10,40,20,60,70,30,1,50,504,447,15,154,44,4,5,4,57,4,4,4,54,4,74,74854,64,64,6,6,7,4,4,64,44 };
int length = sizeof(dataArr) / sizeof(int);
srcFile = fopen("src.data", "wb");
fwrite(dataArr, sizeof(int), length, srcFile);
fclose(srcFile);
srcFile = fopen("src.data", "rb");
dstFile = fopen("dst.data", "wb");
fseek(srcFile, 0L, SEEK_END);
int rcdNumber = (int)(ftell(srcFile) / RCDSIZE);
int fNumber = rcdNumber / BFRSIZE + 1;
struct fileInfo* tmpFiles = (struct fileInfo*)malloc(sizeof(struct fileInfo) * fNumber);
if (tmpFiles == NULL) return 0;
int* buffer = (int*)malloc(BFRSIZE * RCDSIZE);
if (buffer == NULL) return 0;
for (i = 0; i < fNumber; i++)
{
sprintf(tmpFiles[i].fname, "%stmp_%d.data", "t", i);
tmpFiles[i].fp = fopen(tmpFiles[i].fname, "wb");
tmpFiles[i].min = 0;
tmpFiles[i].is_eof = 0;
}
fseek(srcFile, 0L, SEEK_SET);
for (f = 0; f < fNumber - 1; f++)
{
fread (buffer, RCDSIZE, BFRSIZE, srcFile);
bubbleSort (buffer, BFRSIZE);
fwrite (buffer, RCDSIZE, BFRSIZE, tmpFiles[f].fp);
}
fread (buffer, RCDSIZE, rcdNumber % BFRSIZE, srcFile);
bubbleSort (buffer, rcdNumber % BFRSIZE);
fwrite (buffer, RCDSIZE, rcdNumber % BFRSIZE, tmpFiles[f].fp);
for (f = 0; f < fNumber; f++) fclose(tmpFiles[f].fp);
for (f = 0; f < fNumber; f++) tmpFiles[f].fp = fopen(tmpFiles[f].fname, "rb");
rewind(dstFile);
int minFile = 0;
int minValue = 0;
int frByte;
for (f = 0; f < fNumber; f++)
{
rewind(tmpFiles[f].fp);
frByte = fread(&(tmpFiles[f].min), RCDSIZE, 1, tmpFiles[f].fp);
if (frByte == 0) tmpFiles[f].is_eof = 1;
}
int done;
while (1)
{
done = 1;
for (f = 0; f < fNumber; f++) if (!tmpFiles[f].is_eof) done = 0;
if (done) break;
minFile = 0;
for (f = 0; f < fNumber; f++)
{
if (tmpFiles[f].is_eof == 1) continue;
else minFile = f; break;
}
for (f = 0; f < fNumber; f++)
{
if (tmpFiles[f].is_eof == 1) continue;
else if (tmpFiles[minFile].min > tmpFiles[f].min) minFile = f;
}
fwrite(&(tmpFiles[minFile].min), RCDSIZE, 1, dstFile);
frByte = fread(&(tmpFiles[minFile].min), RCDSIZE, 1, tmpFiles[minFile].fp);
if (frByte == 0) tmpFiles[minFile].is_eof = 1;
}
for (f = 0; f < fNumber; f++)
{
fclose(tmpFiles[f].fp);
_unlink(tmpFiles[f].fname);
}
fclose(srcFile);
fclose(dstFile);
free(tmpFiles);
int data;
srcFile = fopen("src.data", "rb");
printf("srcFile : ");
for (i = 0; i < rcdNumber; i++)
{
fread(&data, RCDSIZE, 1, srcFile);
printf(" %d ", data);
}
printf(" \n\n");
fclose(srcFile);
dstFile = fopen("dst.data", "rb");
printf("dstFile : ");
for (i = 0; i < rcdNumber; i++)
{
fread(&data, RCDSIZE, 1, dstFile);
printf(" %d ", data);
}
printf(" \n\n");
fclose(dstFile);
return 0;
}